2009-06-30 1 views
2

Ich möchte einen zusätzlichen Roadblock in meiner Anwendung hinzufügen, um zu verhindern, dass es über Javascript automatisiert wird, insbesondere wenn die automatisierten Anfragen über XMLHttpRequest von einem der gängigen Browser stammen.Zuverlässige Möglichkeit, XMLHttpRequest (Browser-Sniffing für AJAX-Anfragen) in ASP.NET zu sniffen?

Gibt es ein zuverlässiges Anzeichen für eine XMLHttpRequest, die ich in ASP.NET verwenden kann?

Und ich denke, die andere verwandte Frage ist, ist es schwierig für XMLHttpRequest, um eine gewöhnliche menschliche getriebene Anfrage zu sein? Denn wenn es so ist, dann denke ich, ich bin auf Narrenbesetzungen.

UPDATE: Ich könnte die Frage zu knapp formulieren. Das Ziel ist, zu erkennen: Code, der von jemand anderem geschrieben wurde, nicht von einem normalen Browser gesendet wurde, ein Bot sein könnte, möglicherweise nicht von meinen Intranet-Kunden usw. Bisher sind mir XHR- und .NET WebRequest-Anfragen in den Sinn gekommen.

Antwort

4

Sie immer einen CAPTCHA verwenden könnte, um sicherzustellen, dass ein Mensch für die Einreichung des Antrags zuständig ist. recaptcha.net ist kostenlos und hilft bei der Digitalisierung von Büchern.

Edit:

Wenn Sie wissen, welche Art von bösartigem Verhalten, das Sie zu verhindern versuchen, könnten Sie einfache Algorithmen entwickeln, um dieses Verhalten zu erkennen. Wenn dieses Verhalten erkannt wird, können Sie den Client mit einem CAPTCHA herausfordern, um sicherzustellen, dass ein Mensch verantwortlich ist. Dieser Ansatz wird allmählich gängige Praxis. Werfen Sie einen Blick auf diese post zu diesem Thema.

+0

Ich habe darüber nachgedacht, aber der Kunde fühlt, dass alle seine Seiten gleichermaßen empfindlich sind, und ich kann sie nicht bitten, auf jeder Seite ein Captcha zu setzen, oder auf jeder Seite eine Passwortabfrage. – MatthewMartin

+1

Setzen Sie das CAPTCHA auf die erste Seite, und Sie können dann davon ausgehen, dass die anderen von einem legitimen Benutzer angefordert werden. Oder verwenden Sie auch ein minimales Zeitlimit zwischen Anfragen wie SO oder werfen Sie CAPTCHA, wenn die Anfrage in einer bestimmten Zeitspanne wie Facebook x überschreitet. –

4

Nein, es gibt keine Möglichkeit, dies zu tun. Viele der populären Bibliotheken wie jQuery setzen einen speziellen Header ("x-requested-with" für jquery), um anzuzeigen, dass es sich um einen Ajax-Aufruf handelt, aber das ist natürlich freiwillig seitens des Clients.

Sie müssen davon ausgehen, dass jede Anfrage erhalten Sie leider schädlich sind

0

Soweit ich weiß, alle Implementierungen von XMLHttpRequest einen Header auf die Anforderung hinzufügen.

Edit:

Sorry, der Header (zumindest unter PHP) ist 'HTTP_X_REQUESTED_WITH'

+0

Dies ist nicht standardmäßig hinzugefügt, es wird freiwillig von der Client-Bibliothek hinzugefügt –

+1

Wenn jedoch dieser Header festgelegt ist, dann ist es definitiv ein XMLHttpRequest. – Thomas

+3

Fehle ich etwas oder könnte dieser Header nicht auch in einer manuell gesendeten Anfrage gefälscht werden? –

1

Sie können ein paar hinterhältige Dinge tun, aber leider wird es nicht jeden abschrecken. Sie können beispielsweise JavaScript auf einer Start-/Anmeldeseite platzieren, die beim Laden der Seite ausgeführt wird. Dieses JavaScript verursacht eine Umleitung und schreibt möglicherweise einen verschlüsselten Cookie-Wert, der an den Server zurückgesendet wird. Die Verwendung von XMLHttpRequest (oder anderen) führt offensichtlich nur den Inhalt zurück und führt kein JavaScript aus, so dass Sie diese Anfragen herausfiltern können, da sie nicht den vom Skript gesetzten Cookie-Wert haben. Etwas Verschleierung am JavaScript durchzuführen, wäre noch besser.

1

Es gibt keine Möglichkeit herauszufinden, ob eine Anfrage gefälscht ist oder nicht. Mit der .NET HttpWebRequest-Klasse können Sie jede gültige HTTP-Anfrage von einem Browser perfekt nachahmen.Aber je nach Anwendung, können Sie eine der folgenden Möglichkeiten berücksichtigen:

  • Blick auf HTTP-Header die krasseste Versuche zu finden
  • Prevent zu viele Anfragen von derselben IP-Adresse in einem kurzen Zeitrahmen
  • erfordern eine Anmeldung
  • Nur erlauben bestimmte IP-Adressbereiche
  • CAPTCHAs
  • Run einige Javascript-Code, bevor einreichen einen Hack mit .NET HttpWebRequest härter (siehe Mark Barnard Antwort) machen

Sie müssen herausfinden, warum Menschen versuchen, dies zu tun, und dann einen Weg finden, um es sehr unbequem für sie zu machen. Möglicherweise so, dass Sie das Validierungsverfahren leicht modifizieren können, so dass sie ständig mithalten müssen.

1

Sie könnten eine Strategie mit request challenge tokens implementieren, nicht unähnlich dem, was für CSRF/XSRF Schutz verwendet werden könnte. Eine andere mögliche Alternative könnte die Authentifizierung sein, obwohl, wenn Sie eine öffentliche Website haben, dies nicht sehr freundlich sein könnte.

Verwandte Themen