it-swarm.com.de

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

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 stammt 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.

12
Daniel Bingham

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.

12
delete

Kurz gesagt, nein. Jede über GET oder POST an eine URL gesendete Anfrage kann von jedem Benutzer mit einer beliebigen Software gestellt werden. Tatsächlich unterscheidet sich eine AJAX -Anforderung 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. Wenn Benutzer jedoch in der Lage sind, die Site durch Aufrufen Ihres Skripts mit schlechten Daten zu manipulieren, tun Sie es falsch.

Wahrscheinlich wird die beste Lösung darin bestehen, eine Art Authentifizierung einzuführen.

6
DisgruntledGoat

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 der Wert von $_SERVER['HTTP_X_REQUESTED_WITH'] überprüft wird.

Quelle

3
theycallmemorty

Wie jemand anderes betonte ... Ajax-Aufrufe sind nur Empfänger von $ _GET oder $ _POST, daher bestand mein Ansatz immer darin, sie wie jede andere 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

1
digit1001

Ich denke, ein großer Teil Ihrer Lösung wird Ratenbegrenzung Verkehr von einem bestimmten Benutzer Fingerabdruck sein. Möglicherweise ein Hash aus IP-Adresse, User Agent-Zeichenfolge und den gesendeten Daten.

Auch das Binden der Seite, die den Ajax aufruft, an die näher zurückgegebenen Ajax-Daten kann hilfreich sein. Senden Sie also auf der fraglichen Seite beim Laden der Seite einen Sitzungsschlüssel herunter, der für X Sitzungen geeignet ist. Für jede Ajax-Anforderung muss Ihr JavaScript diesen Schlüssel zurückgeben, oder der Ajax gibt einen Fehler zurück. Wenn Ihre Seite X+1 Ajax-Aufrufe enthält, zwingen Sie den Benutzer, eine Aktion auszuführen (möglicherweise Captcha? Möglicherweise sogar ein mousemove- oder tap -Ereignis, je nach UA), bevor Sie eine neue Sitzung senden Schlüssel den Draht runter (außerhalb des Bandes vom ursprünglichen Ajax), dann starte den Prozess neu.

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.

0
artlung