Wie kann ich verhindern, dass ein Power-User meine Ajax-Funktionen aufruft?

12

Ich habe eine Site, die Ajax-Aufrufe verwendet, um eine Reihe von Funktionen auszuführen. Der Webbrowser ruft ein Skript auf - ajax.php. Obwohl ich Post-Daten verwende, um die Daten zu übertragen und die Befehle zu begrenzen, die das Ajax-Skript aufrufen kann, hindert nichts Benutzer daran, Ajax-Aufrufe zu fälschen, um zu versuchen, die Site zu manipulieren. Gibt es eine pauschale Möglichkeit, um zu verhindern, dass Benutzer die Anrufe fälschen? Gibt es eine Möglichkeit, um sicherzustellen, dass ein Ajax-Aufruf tatsächlich von meiner Website kommt und nicht von einem anderen Skript oder einer anderen Website?

Oder muss ich einfach die Randbedingungen im PHP-Skript überprüfen und die Benutzer daran hindern, Dinge zu fälschen, die sie nicht dürfen, aber ihnen erlauben, zu fälschen, wo sie dürfen.

Daniel Bingham
quelle
Sind die Ajax-Anrufe vollständig nicht authentifiziert? Erstellen Sie Sitzungen für jede? Gibt es Muster für den Missbrauch? Und sind die problemspezifischen Manipulationen oder mehr die Menge an Last, die der Site hinzugefügt wird?
Artlung
Können Sie bitte weitere Einzelheiten veröffentlichen? Was machen die AJAX-Anrufe? Was manipulieren sie? Welche Probleme treten auf, wenn das Skript außerhalb von AJAX aufgerufen wird?
DisgruntledGoat
Ich frage nicht wirklich nach einem bestimmten Umstand, sondern nach einer allgemeinen Lösung, die auf viele Umstände anwendbar ist. Wenn es eine solche Lösung gibt, scheint es keine zu geben.
Daniel Bingham

Antworten:

12

Ich glaube nicht, dass es eine Möglichkeit gibt, dies zuverlässig zu tun, da Informationen, die Sie möglicherweise senden, gefälscht werden können, je nachdem, wie schlau der Benutzer ist.

Wenn Sie nur möchten, dass eine einfache Gruppe von Personen nicht von Ihrer Seite aus anruft, können Sie den Referrer überprüfen, ein Cookie verwenden oder ein zufälliges verstecktes Feld hinzufügen, das von der aufrufenden Seite gesendet wird und nach einer bestimmten Zeit abläuft. Aber diese sind leicht zu fälschen, wenn der Benutzer wirklich bestimmt ist.


quelle
2
+1 .. genau wie es unmöglich ist, Leute davon abzuhalten, lokale Kopien von irgendetwas zu speichern, was ihr Browser anzeigt. Es ist eher ein Wettbewerb, um zu sehen, ob man sie dazu bringen kann, aufzugeben und sich etwas anderem zuzuwenden, bevor sie es herausfinden.
Tim Post
6

Kurz gesagt, nein. Jede Anfrage an eine URL über GET oder POST kann von jedem gestellt werden, der eine beliebige Software verwendet. Tatsächlich unterscheidet sich eine AJAX-Anfrage nicht vom direkten Laden der URL, mit der Ausnahme, dass die zurückgegebenen Daten im Browser wie eine Webseite angezeigt werden.

Dies ist genau der Grund, warum Sie übermittelte Daten auf dem Server immer validieren sollten, unabhängig davon, ob Sie eine Javascript-Validierung durchführen oder nicht.

Es ist nicht klar, was genau das serverseitige Skript tut und was möglicherweise schief geht, aber wenn Benutzer in der Lage sind, "die Site zu manipulieren", indem sie Ihr Skript mit schlechten Daten aufrufen, dann tun Sie es falsch.

Die wahrscheinlich beste Lösung ist die Einführung einer Art Authentifizierung.

Verärgerte Ziege
quelle
3

Sie möchten ajax.php also darauf beschränken, nur auf AJAX-Anfragen zu antworten?

Ich bin kein PHP-Experte, aber es scheint möglich zu sein, festzustellen, ob eine bestimmte Anfrage von AJAX oder einer "regulären" Browseranfrage stammt, indem Sie den Wert von überprüfen $_SERVER['HTTP_X_REQUESTED_WITH'].

Quelle

sie erinnern sich
quelle
2
guter Punkt, vorausgesetzt, der Missbraucher verwendet keine Ajax oder fälschen diesen HTTP-Header
Adam
1

Wie jemand anderes hervorhob ... Ajax-Aufrufe sind nur Empfänger von $ _GET oder $ _POST, daher bestand mein Ansatz immer darin, sie wie jede Aktionsseite zu behandeln und die Eingabe zu filtern / zu bereinigen. Wenn Sie beispielsweise eine kleine Abweichung von den erwarteten Werten für einen Monat haben und wissen, dass diese immer im Format "Jan, Feb, Mar ..." vorliegen, können Sie ein Array der erwarteten Werte festlegen und danach filtern. Fangen Sie alles ein, was nicht passt, und werfen Sie optional etwas zurück wie "Bzzt ... danke, dass Sie gespielt haben ..."

Ich kann mir kein Beispiel vorstellen, in dem mein Ajax-Skript sicherer sein müsste als eine Formularübermittlung.

HTH

digit1001
quelle
+1 für "Bzzt" - was im Kontext von "Bzzt - Danke fürs Spielen" umso lustiger wird! Gefolgt von einer langsamen Schwarzfärbung, begleitet von einem dreistündigen Verbot, das durch ein Cookie auf dem Computer des Benutzers erzwungen wird (ich bin sicher, sie würden die Nachricht erhalten)
danlefree
0

Ich denke, ein großer Teil Ihrer Lösung wird darin bestehen , den Verkehr von einem bestimmten Benutzerfingerabdruck aus auf die Geschwindigkeit zu beschränken . Möglicherweise ein Hash aus IP-Adresse, User Agent-Zeichenfolge und den gesendeten Daten.

Das Binden der Seite, die den Ajax aufruft, an die näher zurückgegebenen Ajax-Daten kann ebenfalls hilfreich sein. Senden Sie also auf der fraglichen Seite beim Laden der Seite einen für XSitzungen geeigneten Sitzungsschlüssel herunter. Für jede Ajax-Anforderung muss Ihr JavaScript diesen Schlüssel zurückgeben, oder der Ajax gibt einen Fehler zurück. Sobald Ihre Seite auf X+1Ajax-Aufrufe stößt , zwingen Sie den Benutzer, eine Aktion auszuführen (möglicherweise ein Captcha? Möglicherweise sogar etwas wie ein mousemoveoder ein tapEreignis, abhängig von der UA), bevor Sie einen neuen Sitzungsschlüssel über die Leitung senden (bandextern vom ursprünglichen Ajax) und anschließend neu starten der Prozess.

Obwohl ich darüber nachdenke, ist es möglich, dass ein Teil Ihres Problems in der laxen Validierung der gesendeten Parameter besteht. Wenn die Leute nur mit den gesendeten Parametern spielen und gültige Daten zurückbekommen können, ist das schwieriger. Wie das geht, hängt davon ab, welche Werte vom Client gesendet werden und welche Art von Unheil ein schlechter Schauspieler anrichten kann, wenn er schlechte Werte sendet.

artlung
quelle