Ich erstelle einen Webdienst, der ausschließlich JSON für seine Anforderungs- und Antwortinhalte verwendet (dh keine formularcodierten Nutzdaten).
Ist ein Webdienst für CSRF-Angriffe anfällig, wenn Folgendes zutrifft?
Jede
POST
Anfrage ohne ein JSON-Objekt der obersten Ebene, z. B.,{"foo":"bar"}
wird mit einer 400 abgelehnt. Beispielsweise würde einePOST
Anfrage mit dem Inhalt42
somit abgelehnt.Jede
POST
Anfrage mit einem anderen Inhaltstyp alsapplication/json
wird mit einem 400 abgelehnt. Beispielsweise würde einePOST
Anfrage mit einem Inhaltstypapplication/x-www-form-urlencoded
abgelehnt.Alle GET-Anforderungen sind sicher und ändern daher keine serverseitigen Daten.
Clients werden über ein Sitzungscookie authentifiziert, das ihnen der Webdienst gibt, nachdem sie über einen POST mit JSON-Daten ein korrektes Paar aus Benutzername und Kennwort angegeben haben, z
{"username":"[email protected]", "password":"my password"}
.
Nebenfrage: Sind PUT
und DELETE
Anfragen jemals für CSRF anfällig? Ich frage, weil es den Anschein hat, dass die meisten (alle?) Browser diese Methoden in HTML-Formularen nicht zulassen.
BEARBEITEN: Artikel 4 hinzugefügt.
BEARBEITEN: Bisher viele gute Kommentare und Antworten, aber niemand hat einen bestimmten CSRF-Angriff angeboten, für den dieser Webdienst anfällig ist.
Antworten:
Schmieden willkürliche CSRF - Anfragen mit beliebigen Medientypen ist effektiv nur mit XHR, weil ein Methode des Formulars beschränkt ist , GET und POST und ein POST - Nachrichtentext des Formulars wird auch auf die drei Formate beschränkt
application/x-www-form-urlencoded
,multipart/form-data
undtext/plain
. Mit der Formulardatencodierung isttext/plain
es jedoch weiterhin möglich, Anforderungen zu fälschen, die gültige JSON-Daten enthalten .Die einzige Bedrohung geht also von XHR-basierten CSRF-Angriffen aus. Und diese werden nur dann erfolgreich sein, wenn sie denselben Ursprung haben, also im Grunde genommen irgendwie von Ihrer eigenen Site (z. B. XSS). Achten Sie darauf, CORS nicht als Schutz zu deaktivieren (dh Access-Control-Allow-Origin: * nicht festzulegen). CORS verhindert einfach, dass Clients die Antwort lesen. Die gesamte Anfrage wird weiterhin vom Server gesendet und verarbeitet.
quelle
application/json
welchen Enctype CSRF-Angriffe in dieser Antwort abgewehrt werden sollen . Mit dem vorgeschlagenen Standard können Sie den Enctype auf setzenapplication/json
, wodurch die in der Antwort beschriebenen Inhaltsartenprüfungen zunichte gemacht und die Anwendung für CSRF geöffnet werden.application/json
Formularbeiträge der gleichen Ursprungsrichtlinie entsprechen müssen, was bedeutet, dass der Angriff nicht stärker als XHR ist.Ja, es ist möglich. Sie können einen Angreifer-Server einrichten, der eine 307-Weiterleitung an den Zielserver an den Opfercomputer zurücksendet. Sie müssen Flash verwenden, um den POST zu senden, anstatt das Formular zu verwenden.
Referenz: https://bugzilla.mozilla.org/show_bug.cgi?id=1436241
Es funktioniert auch auf Chrome.
quelle
Es ist möglich, CSRF auf JSON-basierten Restful-Diensten mit Ajax durchzuführen. Ich habe dies in einer Anwendung getestet (sowohl mit Chrome als auch mit Firefox). Sie müssen den contentType in text / plain und den dataType in JSON ändern, um eine Preflight-Anforderung zu vermeiden. Dann können Sie die Anfrage senden, aber um Sitzungsdaten zu senden, müssen Sie das withCredentials-Flag in Ihrer Ajax-Anfrage setzen. Ich diskutiere dies hier ausführlicher (Referenzen sind enthalten):
http://wsecblog.blogspot.be/2016/03/csrf-with-json-post-via-ajax.html
quelle
Ich habe einige Zweifel in Bezug auf Punkt 3. Obwohl dies als sicher angesehen werden kann, da es die Daten auf der Serverseite nicht verändert, können die Daten dennoch gelesen werden und das Risiko besteht darin, dass sie gestohlen werden können.
http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx/
quelle
Ja. Es ist immer noch HTTP.
Ja
Denken Sie, dass ein Browser die einzige Möglichkeit ist, eine HTTP-Anfrage zu stellen?
quelle