2012-05-08 9 views
5

Ich programmiere eine Website, auf der man Sachen posten kann. Dies funktioniert mit der folgenden jQuery Ajax:php timer, um nur alle zwei Sekunden eine Benutzereingabe zuzulassen

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

Jetzt frage ich mich: Wer könnte seine eigene Ajax schreiben etwas auf die Seite zu schreiben und tun dies immer und immer wieder. Wie verhindere ich das? Ich bin sicher, dass ich eine Art Sicherheitscheck in post.php benötigen würde - ich habe bereits von http-Referer gehört, aber das kann geändert werden, so dass es nicht wirklich vertrauenswürdig ist.

Ich möchte auch einen Timer in post.php hinzufügen, der sicherstellt, dass ein Beitrag von der gleichen IP-Adresse kann nur einmal alle x Sekunden gebucht werden, und setzt den Timer, wenn der Beitrag unter x Sekunden gesendet wird (Art von wie Stack-Überlauf macht es mit den Kommentaren).

Weiß jemand, wie man den Ajax sichert und auch wie man den Timer einstellt? Oder irgendwelche anderen Ideen, wie man den Buchungsmechanismus sichert?

Vielen Dank!

Dennis

+0

einziger Weg ist, eindeutige Kennung von Benutzern zu erstellen, und überprüfen Sie dies auf der Serverseite. Vertrauen Sie auf Daten in der DB, als ob Ihr Code in PHP gut ist, es wird keine Unordnung geben. Alles in Ajax ist nur für UX –

+0

Könnten Sie weiter ausführen? UX? – weltschmerz

+0

UX = Benutzererfahrung –

Antwort

1

Ihre beste Ansatz wäre, um Ihre Informationen in einer Datenbank zu speichern. Sie könnten vier Felder in einer Tabelle haben:

ipAddress, submitDate, postText, imageUrl 

Nach Vorlage, ob es in der DB für die aktuelle IP-Adresse ein Eintrag ist. Wenn ja, vergleichen Sie das Einreichungsdatum des Eintrags mit dem aktuellen Datum, und wenn es über Ihrem Schwellenwert liegt, erlauben Sie die Einreichung. Andernfalls geben Sie eine Fehlermeldung aus und leiten den Benutzer zurück.

Dies ist jedoch immer noch nicht idiotensicher, da die IP-Adresse auch gefälscht werden kann oder der Benutzer sich hinter einem Proxy verstecken kann.

+1

Beachten Sie auch, dass wenn Ihre Benutzer alle aus einem Universitäts-Wohnheim kommen und hinter einer IP-Adresse NAT-geschaltet sind, Sie zwei Personen daran hindern würden, gleichzeitig zu posten. –

+0

Ich könnte eine Kombination aus der IP-Adresse und dem User-Agent verwenden - würde das funktionieren? – weltschmerz

+0

@DMoses Guter Punkt. OP hat ausdrücklich die IP-Adresse angegeben, aber um das Problem zu lösen, können Sie entweder eine E-Mail-Adresse anfordern oder eine vollwertige Benutzeranmeldung durchführen. Große Hämmer für große Nägel. –

1

speichern Sie einfach die IP und die Anfragezeit in einer Protokolldatei. Dann überprüfen Sie die Protokolldatei bei jeder Anfrage auf Existenz dieser IP und vergleichen Sie die gespeicherte Zeit.

Hier ist ein einfaches Skript, das nur nach 10 Sekunden eine Anfrage von der gleichen IP erlaubt:

$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

tolle Funktion! Danke! – weltschmerz

Verwandte Themen