TLDR: non c'è nulla che impedisce al codice dannoso di falsificare l'origine. Quando ciò accade, il tuo server non lo saprà mai e agirà sulle richieste. A volte queste richieste sono costose. Quindi non utilizzare CORS al posto di alcun tipo di sicurezza.
Di recente ho giocato con CORS e mi sono posto la stessa domanda. Quello che ho scoperto è che il browser potrebbe essere abbastanza intelligente da conoscere una richiesta CORS falsificata quando ne vede una, ma il tuo server non è così intelligente.
La prima cosa che ho scoperto è che l' Origin
intestazione è un nome di intestazione proibito HTTP che non può essere modificato a livello di codice. Ciò significa che puoi modificarlo in circa 8 secondi usando Modifica intestazioni per Google Chrome .
Per verificarlo, ho impostato due domini Client e un dominio Server. Ho incluso una whitelist CORS sul server, che ha consentito le richieste CORS dal client 1 ma non dal client 2. Ho testato entrambi i client, e in effetti le richieste CORS del client 1 hanno avuto successo mentre il client 2 ha fallito.
Quindi ho falsificato l' Origin
intestazione del client 2 in modo che corrispondesse a quella del client 1. Il server ha ricevuto l' Origin
intestazione contraffatta e ha superato con successo il controllo della whitelist (o non è riuscito se sei un tipo mezzo vuoto). Successivamente, il server ha funzionato rispettosamente consumando tutte le risorse che è stato progettato per consumare (chiamate al database, invio di e-mail costose, invio di messaggi sms ancora più costosi, ecc.). Fatto ciò, il server ha rispedito felicemente l' Access-Control-Allow-Origin
intestazione contraffatta al browser.
La documentazione che ho letto afferma che il Access-Control-Allow-Origin
valore ricevuto deve corrispondere Origin
esattamente al valore inviato nella richiesta. Hanno abbinato, quindi sono rimasto sorpreso quando ho visto il seguente messaggio in Chrome:
XMLHttpRequest non può essere caricato http://server.dev/test
. L'intestazione "Access-Control-Allow-Origin" ha un valore http://client1.dev
che non è uguale all'origine fornita. http://client2.dev
Pertanto, Origin non può accedere.
La documentazione che ho letto non sembra essere accurata. La scheda di rete di Chrome mostra chiaramente sia le intestazioni di richiesta che di risposta http://client1.dev
, ma puoi vedere nell'errore che Chrome in qualche modo conosce la vera origine http://client2.dev
e rifiuta correttamente la risposta. Il che non importa a questo punto perché il server aveva già accettato la richiesta falsificata e speso i miei soldi.
foo.com
) deve fornire l'Access-Control-Allow-Origin
intestazione, altrimenti il browser non consente la richiestabar.com
.