2013-03-19 6 views
13

Wir POSTen eine AJAX-Anforderung an einen Server lokal ausgeführt wird, das heißtChrome Hinzufügen Origin-Header gleichen Ursprungs Anfrage

xhr.open("POST", "http://localhost:9000/context/request"); 
xhr.addHeader(someCustomHeaders); 
xhr.send(someData); 

Die Seite, dass dieses Javascript ausgeführt wird, wird auch von localhost serviert: 9000, dh das sieht völlig nach einer Anfrage mit derselben Herkunft aus.

Aus irgendeinem Grund setzt Google Chrome in der resultierenden Anfrage jedoch immer einen Origin-Header, was dazu führt, dass unser Server die Anfrage basierend auf der falschen Annahme, dass es sich um eine CORS-Anfrage handelt, blockiert.

Dies geschieht nicht in Firefox.

Außerdem senden weder Firefox noch Chrome eine OPTIONS Preflight-Anfrage, was verwirrend ist; Warum sollte ein Origin-Header ohne vorherige Preflight-Prüfung gesetzt werden, um sicherzustellen, dass der Origin- und der Custom-Header vom Server zugelassen sind?

Weiß jemand, was in diesem Fall vor sich geht? Missverstehen wir die CORS-Spezifikation?

+0

Weitere Informationen finden Sie unter http://seclab.stanford.edu/websec/csrf/csrf.ppt. Hier wird erläutert, warum der Origin-Header für POST-Anfragen mit demselben Ursprung geeignet ist. Es ist ein CSRF-Schutzmechanismus. – user239558

Antwort

22

Chrome und Safari enthalten einen Origin Header für POST/PUT/DELETE-Anfragen mit identischem Ursprung (GET-Anfragen mit demselben Ursprung haben keinen Origin-Header). Firefox enthält keinen Origin Header für Anfragen mit gleichem Ursprung. Browser erwarten keine CORS-Antwortheader für Anfragen mit demselben Ursprung, daher wird die Antwort auf eine Anfrage mit demselben Ursprung an den Benutzer gesendet, unabhängig davon, ob CORS-Header vorhanden sind oder nicht.

Ich würde empfehlen, die Host Kopfzeile zu überprüfen, und wenn es die Domäne in der Origin Header entspricht, behandeln Sie nicht die Anfrage als CORS. Die Header in etwa so aussehen:

Host: example.com 
Origin: http://example.com 

Beachten Sie, dass Origin das Schema haben (http/https), Domäne und Port, während Host nur die Domäne und Port haben.

+0

Das macht viel Sinn - wir wechseln den CORS-Filter entsprechend. Vielen Dank! –

13

Nach RFC 6454 - Das Web Origin Konzept - das Vorhandensein von Origin ist eigentlich legal für jede HTTP-Anforderung, einschließlich gleichgeschlechtlicher Herkunft Anfragen:

http://tools.ietf.org/html/rfc6454#section-7.3

„Der Benutzer Agent kann ein Origin-Header-Feld in einer beliebigen HTTP Anfrage enthalten. "

Verwandte Themen