2012-05-08 10 views
5

Sto programmando un sito Web in cui è possibile pubblicare materiale. Questo funziona con il seguente jQuery Ajax:timer php per consentire l'input dell'utente ogni due secondi

$.ajax({ 
     type: 'POST', 
     url: 'action/post.php', 
     data: 'posttext='+posttext+'&imageurl='+imageurl, 
     success: function(feedback){ 
      $('#feedback').val(feedback); 
     } 
    }); 

Ora mi chiedo: qualcuno potrebbe scrivere il suo Ajax per pubblicare qualcosa al sito e farlo più e più volte. Come posso evitare questo? Sono sicuro che avrei bisogno di qualche tipo di controllo di sicurezza in post.php - Ho già sentito parlare di http referer, ma questo può essere modificato quindi non è davvero affidabile.

Inoltre vorrei aggiungere un timer in post.php che si assicura che un post dallo stesso indirizzo ip possa essere pubblicato solo una volta ogni x secondi, e ripristina il timer se il messaggio viene inviato sotto x secondi (tipo di overflow dello stack simile lo fa con i commenti).

Qualcuno sa come proteggere l'ajax e anche come impostare il timer? O qualche altra idea su come proteggere il meccanismo di pubblicazione?

Grazie!

Dennis

+0

L'unico modo è quello di creare identificatore univoco di utenti, e controllare questo sul lato server. Affidatevi ai dati in DB, come se il vostro codice in PHP fosse buono, non ci sarebbe niente da fare. Tutto in ajax è solo per UX –

+0

Potresti approfondire ulteriormente? UX? – weltschmerz

+0

UX = esperienza utente –

risposta

1

Il tuo approccio migliore sarebbe quello di memorizzare le informazioni in un database. Si potrebbe avere 4 campi di una tabella:

ipAddress, submitDate, postText, imageUrl 

Dopo l'invio, verificare se c'è una voce nel DB per l'indirizzo IP corrente. In tal caso, confrontare la data di invio della voce con la data corrente e se è oltre la soglia consentire l'invio. In caso contrario, emettere un messaggio di errore e reindirizzare l'utente.

Questo non è ancora infallibile, tuttavia, poiché l'indirizzo IP può anche essere falsificato o l'utente può nascondersi dietro un proxy.

+1

Nota inoltre che se i tuoi utenti provengono tutti da un dormitorio universitario e NATed dietro un indirizzo IP, bloccherai due persone contemporaneamente alla pubblicazione. –

+0

Potrei usare una combinazione di IP e agente utente - funzionerebbe? – weltschmerz

+0

@DMoses Buon punto. OP ha specificato specificamente l'indirizzo IP, ma per risolvere questo problema è possibile richiedere anche un indirizzo e-mail o effettuare un accesso utente completo. Grandi martelli per le unghie grandi. –

1

è sufficiente memorizzare l'IP e il tempo di richiesta in un file di registro. Quindi controllare il file di registro su ogni richiesta di esistenza di tale IP e confrontare il tempo memorizzato.

Ecco un semplice script che consente solo una richiesta dallo stesso IP dopo 10 secondi:

$waitSeconds = 10; 
if (allowRequest($waitSeconds)) { 
    // allowed 
    echo "Welcome."; 
} else { 
    // not allowed 
    echo "Please wait at least $waitSeconds after your last request."; 
} 
echo '<hr /><a href="#" onclick="location.reload(true);return false">try again</a>'; 

function getLastRequestTimeDiff($ip = null, $logFile = null) 
{ 
    if ($ip === null) { 
     // no specific ip provided, grab vom $_SERVER array 
     $ip = $_SERVER["REMOTE_ADDR"]; 
    } 
    if ($logFile === null) { 
     // no specific log file taken 
     $logFile = "./lookup.log"; 
    } 
    if (!is_file($logFile)) { 
     // touch 
     file_put_contents($logFile, serialize(array())); 
    } 
    // read content 
    $logContent = file_get_contents($logFile); 
    // unserialize, check manual 
    $lookup = unserialize($logContent); 
    // default diff (f.e. for first request) 
    $diff = 0; 
    // current timestamp 
    $now = time(); 
    if (array_key_exists($ip, $lookup)) { 
     // we know the ip, retrieve the timestamp and calculate the diff 
     $diff = $now - $lookup[$ip]; 
    } 
    // set the new request time 
    $lookup[$ip] = $now; 
    // serialize the content 
    $logContent = serialize($lookup); 
    // and write it back to our log file 
    file_put_contents($logFile, $logContent); 
    // return diff (in seconds) 
    return $diff; 
} 

// encapsulate our function in a more simple function (allow yes/no) 
function allowRequest($allowed = 10, $ip = null, $logFile = null) 
{ 
    $timeDiff = getLastRequestTimeDiff($ip, $logFile); 
    return $timeDiff >= $allowed; 
} 
+0

funzione fantastica! grazie! – weltschmerz

Problemi correlati