Wie kann ich verhindern, dass eine Form von mehr vorgelegt werden als einmal innerhalb von 5 Minuten?

StackOverflow https://stackoverflow.com/questions/8351470

Frage

Vor kurzem fand ich ein großes Sicherheitsproblem mit meinem PM-System die Benutzer eine Nachricht so viel senden können, da sie mit einer for Schleife in der Adressleiste möchten. Jemand hat diese in die Adressleiste:

javascript:for(x=0;x<10000;x++){ $('#compose form').submit(); }

Und die Nachricht wurde 1000-mal an mich und mein Posteingang war voll von der gleichen Nachricht und meine Datenbank war so voll, dass phpMyAdmin sehr laggy wurde.

Meine Frage ist, wie kann ich das verhindern? Dies ist ein großes Problem.

Außerdem wird die Form mit AJAX eingereicht.

Edit:

ich PHP verwenden, so wie kann ich das verhindern? Wie, wie könnte ich es, wo kann eine Nachricht nur alle 5 Minuten oder so gesendet werden, und wenn sie mehr als eine innerhalb von 5 Minuten einreichen wird ein Fehler angezeigt (oder zeigen keine Benutzer-Feedback überhaupt und es nur davon abhalten wird vorgelegt )?

War es hilfreich?

Lösung

Es gibt eine offensichtliche Art und Weise, es zu beheben und das Problem liegt nicht auf der Client-Seite -. liegt es auf der Server-Seite

Server-Skript sollte es ermöglichen, Nachrichten nicht zu oft das Senden - zB. oft als, sagen wir, einmal alle 10 Minuten. Um es tun können Sie Sitzung Mechanismus auf der Server-Seite und speichern Sie die Informationen, wenn der Benutzer die E-Mail gesendet. Wenn der Benutzer hat eine E-Mail nicht gesendet werden, sollten Sie auch speichern diese Informationen in der Sitzung -. Unterscheiden Menschen mit Sitzung von Menschen mit Sitzung gesperrt freigegeben (und Sie sollen diese von E-Mail an allem Block)

Die Art und Weise Sitzung durchgeführt werden soll (der spezifische Code) ist abhängig von der Sprache, die Sie für die Server-Side-Scripting verwenden (PHP, Python, JSP, etc.).

Andere Tipps

Wenn jemand das Wissen hat, Sie dies zu tun, können Sie wahrscheinlich nichts auf der Client-Seite tun so dass die einzige Option, die ich sagen würde ist, dass Sie sich anmelden oder eine Zählung usw. von der Anzahl der Anforderungen halten (vielleicht zu einem bestimmten Ressource) und verweigert die Anforderung (oder einen „besetzt“ http-Code usw.) für den jeweiligen Benutzer senden.

Ich denke, der einfachste Weg, Anfragen zu zählen von einer bestimmten IP-Adresse wäre (dies offensichtlich Nachteile wie mehrere Benutzer hat hinter einem Proxy oder NAT usw.).

Die tatsächliche Lösung wird Ihre serverseitige Sprache und Web-Server sind abhängig von, aber man könnte vielleicht eine Regel umrahmen und sehen, wie es funktioniert. So etwas wie 5 Anfragen pro Minute pro IP-Adresse (oder was auch immer für Ihre Nutzung geeignet ist).

Wie schon andere gesagt haben, müssen Sie den Schutz auf dem Server implementieren. Kein Betrag der clientseitigen Codierung wird Schutz.

Der gemeinsame Weg, um einen Server gegen diese Art von Missbrauch zu schützen, wird rate limiting genannt. Sie entscheiden, wie oft Sie eine bestimmte Client möchte eine Mitteilung zukommen lassen zu können und Sie den Server-Code alle Nachrichten zu ignorieren, die außerhalb fallen diese Grenze.

Zum Beispiel könnten Sie entscheiden, dass Sie nicht mehr erlauben, als eine Nachricht pro Minute und nicht mehr als zwei Nachrichten alle 10 Minuten und nicht mehr als vier Nachrichten pro Stunde. Sie wählen, was auch immer Sie denken, scheint vernünftig und Sie den Code zu diesem Algorithmus.

In Ihrem Server, würden Sie in der Lage sein zu erkennen, welche Benutzer die Nachricht herkam (höchstwahrscheinlich über einen Authentifizierungs-Cookie) und in Ihrer Datenbank, würden Sie die Lage sein, um herauszufinden, wann die letzte Nachricht wurde von diesem Benutzer gesendet. Sie können sogar in der Lage sein, diese Informationen in RAM in Ihrem Server-Cache (je nachdem, wie Sie Ihren Server arbeitet), um eine Datenbankabfrage bei jeder Anforderung zu vermeiden, da Sie nur aktuelle Informationen halten müssen und Sie nur auf dem Wiederholungstäter, um die Leistung zu optimieren müssen ( diejenigen, die Ihren Server zu missbrauchen und damit eine Anfrage erst vor kurzem gesendet versuchen).

Ich bin damit einverstanden mit dem, was jeder über geschwindigkeitsbestimmend entsendet.

Dies kann jedoch sehr kompliziert sein, auf der Serverseite zu implementieren. Vor allem, wenn Sie horizontale Skalierung starten. Und, ehrlich gesagt, wenn 1000 Meldungen Sie verletzt so schlecht - mein Vorschlag so zu Ihnen noch mehr gelten.

Statt diese Texte selbst zu implementieren, können Sie in einen Dritten Service aussehen wollen es für Sie zu tun, wie diese super coole Web-Dienste-Proxy Apigee

Eines ihrer Merkmale ist, speziell, API Ratendrosselung. (Siehe Link)

eingeben Bild Beschreibung hier

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top