2013-10-24 1 views
6

Von 2 verschiedenen Anwendungen konnte ich Cross-Orgin-Anfragen senden. Obwohl der Browser einen Fehler von Cross-Origin zurückgibt, aber mein Server immer noch die Anfrage empfängt und ausführt. Zum Beispiel von einem entfernten Ort, kann ich Cross-Domain-Anfrage mit,Wie kann man andere Websites stoppen, um domainübergreifende Ajax-Anfragen zu senden?

$.ajax({ 
     xhrFields: { 
      withCredentials: true 
     }, 
     data:{ my: 'a' }, 
     url: 'http://MyApp/Page', 
     type: 'POST' 
}) 

Ich weiß aufrufen, dass der Browser nicht die Antwort auf Skript zurückgibt, aber meine Server-Seite noch auszuführen.

Angenommen, ein unschuldiger Benutzer ist auf einer Website angemeldet, http://abc.com. Diese Anwendung akzeptiert Post-Anforderung zum Einfügen eines Datensatzes. Wenn unschuldige Benutzer unschuldige http://HackerSite.com besuchen, kann die http://HackerSite.com eine POST-Anfrage an http://abc.com über Ajax senden. Wie vermeide ich das?

+2

Schöne Frage. Wenn Sie dafür eine Antwort haben, werde ich mich sehr freuen, wenn Sie if posten. –

+0

Für einen WCF-Dienst können Sie ** crossdomainscriptaccessenabled ** in Ihrer Endpunktkonfiguration auf false setzen. – Saranya

+2

Sie werden das gleiche Problem mit einem Formular senden, kein Javascript beteiligt. Die CORS-Spezifikation wurde nicht mit zusätzlicher Sicherheit erstellt. Stattdessen ermöglicht es Ihnen, im Wesentlichen die gleichen Aktionen auszuführen, die Sie bereits ausführen konnten (sans ajax). Die CORS-Spezifikation geht ein bisschen weiter, indem sie sicherstellt, dass Ihr Server nicht einmal die zugrunde liegende Anfrage erhält, wenn Ihr Server die Spezifikation nicht korrekt annimmt und die gleiche Anfrage nicht sans ajax (ohne Ursprung) gesendet werden konnte. sagen, über ein Formular senden). Dieses letzte Konzept wird Preflight genannt. –

Antwort

2

Die Sicherheitsanfälligkeit, über die Sie sprechen, ist CSRF, aber es kann vor geschützt werden.

Sie können sich davor schützen, dass der POST außerhalb einer AJAX-Anfrage (z. B. durch ein HTML-Formular) gesendet wird, indem Sie den Header X-Requested-With: XMLHttpRequest senden und überprüfen. Dies kann auch nicht domainübergreifend über AJAX gesendet werden, da dieser Header nicht in der sicheren Liste ist (ohne CORS).

jedoch in der Vergangenheit gab es einige Exploits über Plugins wie Flash wo die Header gesetzt werden könnte, die über einen Browser nicht möglich waren (zB Referer) so gegen diese zu schützen, wird empfohlen die synchroniser token pattern zu verwenden, die eine Einstellung beinhaltet Token in einem versteckten Feld, das validiert wird, sowie Cookies für alle zerstörerischen Anfragen. Mit destruktiv meine ich Anfragen, die Dinge ändern, einreichen oder löschen (d. H. Was POSTs sein sollen).

Für weitere Informationen siehe hier: http://www.html5rocks.com/en/tutorials/cors/

+0

In meinem Asp.net web-form case, es sendet den Cookie, Hier sind Regeln des Preflight, 'Der Browser kann die Preflight-Anfrage überspringen, wenn folgende Bedingungen zutreffen: Die Anfrage-Methode ist GET, HEAD oder POST und Die Anwendung tut keine Anforderungsheader außer Accept, Accept-Language, Content-Language, Content-Type oder Last-Event-ID gesetzt und Die Content-Type-Kopfzeile (falls gesetzt) ​​ist eine der folgenden: application/x- www-form-urlencoded multipart/form-data text/plain ' – user960567

+0

Aber ich werde noch einmal überprüfen und Sie wissen. Danke – user960567

+0

Ich denke du hast Recht - ich werde bearbeiten. – SilverlightFox

0

Der Access-Control-Allow-Origin-Header sollte so eingestellt werden, dass die anderen als die von Ihnen benötigten Domänen nicht zugelassen werden. Dies funktioniert jedoch nur für moderne Browser. siehe http://encosia.com/using-cors-to-access-asp-net-services-across-domains/ http://code.google.com/p/html5security/wiki/CrossOriginRequestSecurity

+0

Dies ist nicht der richtige Ort, um Sicherheit zu implementieren. Der Browser/Client kann nicht vertrauenswürdig sein. –

1

Auf einfache Lösung, aber das ist nicht ganz kugelsicher ist, was wir ein „Bestätigungstoken“ nennen. Jeder Post von Ihrer Website sollte ein CSRF-Token haben, das Sie auf der Serverseite validieren, um sicherzustellen, dass die Anfrage wirklich von Ihrer Website kommt. Überprüfen Sie dies für weitere Informationen: http://shiflett.org/articles/cross-site-request-forgeries

Verwandte Themen