2013-03-15 6 views
13

Ho un sito Web che ha bisogno di incrementare i valori in un database in base all'interazione dell'utente. Quando gli utenti fanno clic su un pulsante, viene chiamato uno script php che incrementa il valore. Mi piacerebbe proteggere questo script dall'accesso da script esterni. Attualmente un utente può scrivere la propria pagina web con una funzione javascript che colpisce ripetutamente lo stesso file php per far esplodere il valore nel database.Consentire l'accesso al file PHP solo tramite ajax sul server locale

Ecco il mio codice jQuery che fa l'Incrementale:

jQuery(function(){ 
$('.votebtn').click(function(e){ 
    var mynum = $(this).attr('id').substring(0,5); 
    $.ajax({ 
      url:"countvote.php", 
      type:"GET", 
      data: { 
       thenum:mynum 
      }, 
      cache: false, 
      success:function(data) { 
       alert('Success!'); 
       } 
      } 
     }); 
}); 
}); 

Come potrei fare per fare in modo che solo una chiamata da Ajax/jquery sul server locale possono accedere 'countvote.php'? Se questo non è il modo corretto per farlo, sono aperto a qualsiasi suggerimento che impedisca che il mio script php venga abusato da script esterni.

+0

Riesci a limitare i siti che possono accedere countvote.php solo a quelli sul tuo dominio? – user829323

+0

@ user829323 Questo è banale da forgiare al di fuori del browser con 'wget' –

risposta

3

È possibile verificare se è uguale a xmlhttprequest, ma non è un metodo affidabile per determinare se una richiesta è una richiesta AJAX oppure no, c'è sempre un modo per aggirare questo problema. Ma ti protegge da colpi casuali come url erroneamente inseriti, crawler, ecc.

2

Non c'è davvero un metodo al 100% per farlo. Le richieste AJAX arriveranno sempre da un cliente. Utilizza le richieste POST invece di GET e ciò ti aiuterà a prevenire eventuali problemi, ma non a fermarli completamente e nel tuo php, basta rilasciare tutte le richieste.

+2

Purtroppo questa non è un'opzione. Ho scoperto il modo in cui le richieste di POST di cache iOS 6 derivano da JQuery/AJAX. Quindi sui dispositivi mobili le informazioni sulla risposta sono imprecise. – LoneWolfPR

+0

Controlla questa risposta per risolvere il problema. http://stackoverflow.com/questions/12506897/is-safari-on-ios-6-caching-ajax-results – castis

+1

A meno che non mi sbaglio, penso che sia necessario JQuery 1.5 o superiore per utilizzare il controllo dell'intestazione. Purtroppo ho ostacolato l'utilizzo di 1.3 che non supporta questo. Fa parte di un CMS che non ho la capacità di aggiornare al momento. Grazie comunque. – LoneWolfPR

33

La soluzione richiede due passaggi.

In primo luogo il file Ajax deve consentire l'accesso solo in una richiesta Ajax con questo codice.

define('IS_AJAX', isset($_SERVER['HTTP_X_REQUESTED_WITH']) &&  strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest'); 
if(!IS_AJAX) {die('Restricted access');} 

In secondo luogo il file ajax ha accesso nel nome del file chiamano con il comando $ _SERVER [ 'HTTP_REFERER']. Quindi è possibile limitare l'accesso solo nel server host.

$pos = strpos($_SERVER['HTTP_REFERER'],getenv('HTTP_HOST')); 
if($pos===false) 
    die('Restricted access'); 

Forse il codice può funzionare solo con la seconda parte

+1

questa è davvero una buona idea. e funziona – Kiwy

+3

Questo non funziona. Chiunque può inviare un'intestazione X-Requested-With e Referer con i valori che preferiscono. – Quentin

+0

@Quentin, quindi qual è la soluzione per risolvere i requisiti? Un segreto dato sull'iniziale? –

Problemi correlati