Wie kann ich verhindern, dass ein Formular innerhalb von 5 Minuten mehrmals gesendet wird?

8

Ich habe kürzlich ein riesiges Sicherheitsproblem mit meinem PM-System gefunden, das es Benutzern ermöglicht, eine Nachricht so oft wie gewünscht mit einer for -Schleife in der Adressleiste zu senden. Jemand hat dies in die Adressleiste eingefügt:

%Vor%

Und die Nachricht wurde 1000 Mal an mich gesendet und mein Posteingang war voll mit der gleichen Nachricht und meine Datenbank war so voll, dass phpMyAdmin sehr laggy war.

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

Außerdem wird das Formular mit AJAX gesendet.

Bearbeiten:

Ich benutze PHP, wie kann ich das verhindern? Wie könnte ich zum Beispiel erreichen, dass eine Nachricht nur alle 5 Minuten gesendet wird und wenn sie innerhalb von 5 Minuten mehr als eins sendet, wird ein Fehler angezeigt (oder es wird überhaupt kein Benutzer-Feedback angezeigt und es wird nicht mehr gesendet )?

    
Nathan 02.12.2011, 03:31
quelle

4 Antworten

3

Es gibt einen offensichtlichen Weg, es zu beheben, und das Problem liegt nicht auf der Clientseite - es liegt auf der Serverseite .

Ihr Serverskript darf nicht zu oft Nachrichten senden - z. oft als zum Beispiel einmal alle 10 Minuten. Um dies zu tun, können Sie den Sitzungsmechanismus auf der Serverseite verwenden und die Informationen speichern, wenn der Benutzer die E-Mail gesendet hat. Wenn der Benutzer keine E-Mail gesendet hat, sollten Sie diese Informationen auch in der Sitzung speichern, um Personen mit aktivierter Sitzung von Personen mit deaktivierter Sitzung zu unterscheiden (und Sie sollten diese davon abhalten, E-Mails zu senden).

Die Art und Weise, wie die Sitzung implementiert werden sollte (der spezifische Code), hängt von der Sprache ab, die Sie für serverseitiges Scripting verwenden (PHP, Python, JSP usw.).

    
Tadeck 02.12.2011, 03:42
quelle
2

Wenn jemand das Wissen dafür hat, können Sie wahrscheinlich nichts auf der Client-Seite tun, also ist die einzige Option, die ich sagen würde, dass Sie eine Anzahl von Anfragen protokollieren oder behalten usw. (vielleicht zu einem bestimmten Ressource) und verweigern die Anfrage (oder senden Sie einen "beschäftigt" http-Code usw.) für den bestimmten Benutzer.

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

Die tatsächliche Lösung hängt von Ihrer serverseitigen Sprache und Ihrem Webserver ab, aber Sie könnten vielleicht eine Regel aufstellen und sehen, wie sie funktioniert. Etwa 5 Anfragen pro Minute (oder was auch immer für Ihre Nutzung geeignet ist) pro IP-Adresse.

    
davidsleeps 02.12.2011 03:38
quelle
2

Wie andere bereits gesagt haben, müssen Sie den Schutz auf dem Server implementieren. Keine Menge an clientseitiger Codierung bietet Schutz.

Der übliche Weg, einen Server gegen diese Art von Missbrauch zu schützen, ist rate limiting . Sie entscheiden, wie oft ein bestimmter Client in der Lage sein soll, eine Nachricht zu senden, und Sie codieren den Server, um alle Nachrichten zu ignorieren, die außerhalb dieses Limits liegen.

Sie können beispielsweise festlegen, dass Sie höchstens eine Nachricht pro Minute und nicht mehr als zwei Nachrichten alle zehn Minuten und nicht mehr als vier Nachrichten pro Stunde zulassen. Sie wählen, was Sie für vernünftig halten und Sie kodieren diesen Algorithmus.

Auf Ihrem Server müssten Sie in der Lage sein zu identifizieren, von welchem ​​Benutzer die Nachricht stammt (höchstwahrscheinlich über einen Authentifizierungscookie) und in Ihrer Datenbank müssen Sie herausfinden können, wann die letzte Nachricht gesendet wurde wurde von diesem Benutzer gesendet. Möglicherweise können Sie diese Informationen sogar im RAM Ihres Servers zwischenspeichern (abhängig davon, wie Ihr Server funktioniert), um eine Datenbanksuche bei jeder Anfrage zu vermeiden, da Sie nur die letzten Informationen speichern müssen und nur die Leistungsoptimierung für die Wiederholungstäter benötigen ( diejenigen, die versuchen, Ihren Server zu missbrauchen und daher gerade erst eine Anfrage gesendet haben).

    
jfriend00 02.12.2011 03:42
quelle
1

Ich stimme dem zu, was alle über die Ratenbegrenzung schreiben.

Dies kann jedoch auf der Serverseite sehr kompliziert sein. Vor allem, wenn Sie mit dem Skalieren beginnen. Und, ehrlich gesagt, wenn dir 1000 Nachrichten so weh tun - mein Vorschlag trifft vielleicht noch mehr zu.

Anstatt dies selbst zu implementieren, sollten Sie sich vielleicht einen Drittanbieter-Dienst ansehen, um diesen für Sie zu tun, z. B. diesen super coolen Webservice-Proxy. Apigee

Eines ihrer Merkmale ist speziell die Drosselung der API-Rate. (siehe Link)

    
Steve 02.12.2011 03:47
quelle