TLDR: Rien n'empêche le code malveillant d'usurper l'origine. Lorsque cela se produit, votre serveur ne le saura jamais et agira sur les demandes. Parfois, ces demandes sont coûteuses. N'utilisez donc CORS à la place d'aucun type de sécurité.
J'ai récemment joué avec CORS et je me suis posé la même question. Ce que j'ai trouvé, c'est que le navigateur peut être assez intelligent pour connaître une requête CORS falsifiée lorsqu'il en voit une, mais votre serveur n'est pas aussi intelligent.
La première chose que j'ai trouvée est que l'en- Origin
tête est un nom d'en-tête HTTP interdit qui ne peut pas être modifié par programme. Ce qui signifie que vous pouvez le modifier en environ 8 secondes en utilisant Modifier les en-têtes pour Google Chrome .
Pour tester cela, j'ai configuré deux domaines clients et un domaine serveur. J'ai inclus une liste blanche CORS sur le serveur, qui a permis les demandes CORS du client 1 mais pas du client 2. J'ai testé les deux clients, et en effet les demandes CORS du client 1 ont réussi tandis que le client 2 a échoué.
Ensuite, j'ai usurpé l'en- Origin
tête du client 2 pour qu'il corresponde à celui du client 1. Le serveur a reçu l'en- Origin
tête usurpé et a réussi la vérification de la liste blanche (ou a échoué si vous êtes un type de type verre à moitié vide). Après cela, le serveur a fonctionné consciencieusement en consommant toutes les ressources qu'il était censé consommer (appels à la base de données, envoi d'e-mails coûteux, envoi de messages SMS encore plus chers, etc.). Lorsque cela a été fait, le serveur a volontiers renvoyé l'en- Access-Control-Allow-Origin
tête usurpé au navigateur.
La documentation que j'ai lue indique que la Access-Control-Allow-Origin
valeur reçue doit correspondre Origin
exactement à la valeur envoyée dans la demande. Ils correspondent, donc j'ai été surpris quand j'ai vu le message suivant dans Chrome:
XMLHttpRequest ne peut pas se charger http://server.dev/test
. L'en-tête 'Access-Control-Allow-Origin' a une valeur http://client1.dev
qui n'est pas égale à l'origine fournie. Origin http://client2.dev
n'est donc pas autorisé à accéder.
La documentation que j'ai lue ne semble pas exacte. L'onglet réseau de Chrome montre clairement à la fois les en-têtes de demande et de réponse http://client1.dev
, mais vous pouvez voir dans l'erreur que Chrome sait d'une manière ou d'une autre que l'origine réelle était http://client2.dev
et rejette correctement la réponse. Ce qui n'a pas d'importance à ce stade, car le serveur avait déjà accepté la demande falsifiée et dépensé mon argent.
foo.com
) doit fournir l'en-Access-Control-Allow-Origin
tête, sinon le navigateur n'autorise pas la demandebar.com
.