Schneller und einfacher Hochwasserschutz?

7

Ich habe eine Website, auf der ein Benutzer eine Nachricht mit AJAX an eine Datei mit dem Namen like.php sendet. In dieser Datei wird die Benutzernachricht an eine Datenbank gesendet und sendet dann eine Verbindung zurück an den Benutzer. In meinem Javascript-Code habe ich das Textfeld deaktiviert, in das der Benutzer beim Senden der AJAX-Anfrage eingibt.

Das einzige Problem ist, dass ein böswilliger Benutzer einfach POST-Anfragen an like.php senden und meine Datenbank überfluten kann. Daher möchte ich einen einfachen Hochwasserschutz implementieren.

Ich möchte nicht wirklich den Ärger einer anderen Datenbanktabelle, die Benutzer-IPs und dergleichen protokolliert ... als ob sie meine Site überfluten würden, wird es eine Menge von Datenbank-Lese- / Schreiboperationen geben, die sie verlangsamen. Ich habe über Sitzungen nachgedacht, wie eine Sitzung, die einen Zeitstempel enthält, der jedes Mal überprüft wird, wenn sie Daten an like.php sendet, und wenn die aktuelle Zeit vor dem Zeitstempel ist, können sie Daten zur Datenbank hinzufügen, ansonsten einen Fehler senden und blockiere sie. Wenn sie etwas in die Datenbank eingeben dürfen, aktualisieren Sie ihre Sitzung mit einem neuen Zeitstempel.

Was denkst du? Wäre dies der beste Weg, oder gibt es einfachere Alternativen?

Danke für jede Hilfe. :)

    
VIVA LA NWO 11.06.2010, 22:23
quelle

7 Antworten

5

Verwende ein Token. Sie generieren das Token und fügen es der Seite hinzu, von der die Anfrage stammt. In like.php verifizieren Sie, dass die Anfrage ein gültiges Token enthält, was bedeutet, dass es von Ihrer Seite kommt und nicht direkt von einem externen POST.

    
Matteo Riva 11.06.2010, 22:42
quelle
7

Session ist am einfachsten und hat den geringsten Overhead. Sie können zwei Datenbits in der Sitzung speichern, den Zeitstempel des letzten Posts, und die IP, von der der Post kommt. So überprüfen Sie die Legitimität:

%Vor%     
Majid Fouladpour 11.06.2010 23:23
quelle
3

Eine andere Möglichkeit, dies zu tun, besteht darin, eine verborgene Formulareingabe in die Seite (die like.php aufruft) mit jQuery zu schreiben. Ein Bot wird kein Javascript verwenden, damit Ihr verstecktes Formularfeld nicht existiert.

Suchen Sie nach dem versteckten Feld (weisen Sie ihm einen Wert und einen Namen zu) und wenn es existiert, dann drücken Sie die Datenbank mit der Anfrage.

Ein anderer Weg; Ein verstecktes Element in die Seite einbetten ( <input style='display:none;' name='nospam' value='' /> ). Ein Bot wird automatisch jedes Feld im Formular ausfüllen, also überprüfen Sie, ob dieses Feld ausgefüllt ist - ein Benutzer kann es nicht sehen, also wissen Sie, dass es ein Bot ist, wenn Sie dort Inhalt haben.

Setze den Stil (display: none;) unter Verwendung von jQuery tho ... wieder sieht ein Bot den jQuery nicht, also denkt er, dass dies eine legitime Formulareingabe ist.

Sie können eine "Diese Seite benötigt Javascript ausführen" -Nachricht für den Benutzer angeben. Einige alternative Vorschläge. Immerhin - du sagtest "einfach";)

    
Jongosi 16.04.2012 00:53
quelle
3

Sie müssen nicht die gesamte Aufnahmedatei durchsuchen. Stattdessen:

%Vor%

Anwendungsbeispiel:

%Vor%     
xps 30.03.2015 08:13
quelle
2

Nun, ich habe ein Skript erstellt, das es nur für Kernanforderungen (keine Sitzungsanforderungen oder andere Anforderungen, die nicht den Kern aufrufen) handhabt. Wenn Sie einen Blick auf Google werfen, werden Sie Skripte / Klassen finden, die Ihren Server wegen hoher Last jedes Mal töten werden. Die Tatsache, dass viele SESSIONs und vielleicht ALSO SQL / Database benutzen, wird Ihnen einen Flutungsschutz als Server-Killer verschaffen. Auch die Tatsache, dass SESSIONs einen Cookie (oder eine GET SID) benötigen, damit Sie SESSIONs einfach manipulieren können, um eine neue SESSION ID zu erhalten.

Meine Funktion ist textbasiert und macht eine einfache Handhabung. Die schlechte Sache ist, dass Sie vielleicht einen CronJob verwenden müssen, um ips von Zeit zu Zeit zu löschen. Im Vergleich zu anderen Skripten ist es etwa 10 * schneller (und mehr speichern als Sitzungen).

Ich weiß nicht, ob es wirklich nützlich ist. ;) Vielleicht möchten Sie den Drehzahlwert auf weniger oder / und auch auf 200 req ändern. Meine Einstellung ist ein Verbot für einen Bot, der Intervallanforderungen in & lt; = 6 Sekunden ausführt.

%Vor%

Bearbeiten: Mein Weg, um die Anfragezeit zu testen, war mit Mikrozeit und simuliere 10'000 Benutzer. Ich frage Google und getestet (als Beispiel) Ссылка

Also ich weiß nicht, was dort einfach sein soll? Sie haben etwa 3 SQL-Anfragen gleichzeitig:

%Vor%

Es liefert vielleicht mehr Funktionen, aber alle legitimen Benutzer benutzen servertime für nichts. ;)

    
7three 04.05.2012 16:13
quelle
0
  

Ich habe über Sitzungen nachgedacht, wie   Haben Sie eine Sitzung, die ein enthält   Zeitstempel, der jedes Mal überprüft wird   Sie senden Daten an like.php

Dies wird Bots nicht stoppen, da sie dieselben Cookies wie die Benutzer empfangen und senden können.

Sie sollten sich wirklich in ein solches System einloggen. Scheint es wert, den Zugang zu schützen. Sie könnten auch in Betracht ziehen, Posts pro Minute pro IP einzuschränken, aber mehrere Bots könnten immer noch viele Spam-Nachrichten senden.

Wenn Sie keine Anmeldung durchführen möchten, verwenden viele Websites captcha , um solche Versuche zu vermeiden .

Ссылка

    
webbiedave 11.06.2010 22:32
quelle
0

Wenn Sie aufhören wollen, eine Suchseite zu überfluten, können Sie es wie folgt versuchen:

%Vor%

Wenn Ihr Besucher beispielsweise 10 Mal unter z. 2 Sekunden wird er gestoppt!

    
adilbo 27.04.2016 15:30
quelle

Tags und Links