2013-03-19 16 views
13

Stiamo pubblicando una richiesta AJAX a un server che esegue a livello locale, vale a direChrome aggiungendo intestazione di origine alla richiesta stessa origine

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

La pagina che viene eseguito questo javascript viene anche servito da localhost: 9000, cioè questo sembra totalmente una richiesta di origine identica.

Tuttavia, per qualche motivo, Google Chrome imposta sempre un colpo di testa di origine nella richiesta risultante, causando il nostro server per bloccare la richiesta sulla base del falso presupposto che si tratta di richiesta di CORS.

Questo non accade in Firefox.

Inoltre, né Firefox né Chrome inviano una richiesta di verifica preliminare OPZIONI, il che è fonte di confusione; perché impostare un'intestazione Origin senza prima il preflight per assicurarsi che le intestazioni Origin e Custom siano consentite dal server?

Qualcuno sa cosa sta succedendo in questo caso? Stiamo fraintendendo le specifiche CORS?

+0

Vedere http://seclab.stanford.edu/websec/csrf/csrf.ppt che risponde perché l'intestazione Origin è valida per le richieste POST di origine uguale. È un meccanismo di protezione CSRF. – user239558

risposta

22

Chrome e Safari includono un'intestazione Origin su richieste POST/PUT/DELETE di origine (le richieste GET della stessa origine non hanno un'intestazione Origin). Firefox non include un'intestazione Origin su richieste con origini identiche. I browser non si aspettano le intestazioni di risposta CORS sulle richieste di origini identiche, quindi la risposta a una richiesta di origine identica viene inviata all'utente, indipendentemente dal fatto che abbia intestazioni CORS o meno.

Si consiglia di verificare l'intestazione Host e se corrisponde al dominio nell'intestazione Origin, non trattare la richiesta come CORS. Le intestazioni sono qualcosa del tipo:

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

Nota che Origin avrà lo schema (http/https), il dominio e la porta, mentre Host avrà solo il dominio e la porta.

+0

Questo ha molto senso: cambieremo il filtro CORS in modo conforme. Grazie! –

13

Secondo RFC 6454 - Il Web origine Concetto - la presenza di origine è in realtà legale per qualsiasi richiesta HTTP, comprese le richieste dello stesso origine:

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

"L'utente L'agente può includere un campo di intestazione Origin in qualsiasi richiesta HTTP . "

Problemi correlati