D'après ce que je comprends, si un script côté client s'exécutant sur une page de foo.com veut demander des données à bar.com, dans la demande, il doit spécifier l'en-tête Origin: http://foo.com
et la barre doit répondre avec Access-Control-Allow-Origin: http://foo.com
.
Qu'y a-t-il pour empêcher le code malveillant du site roh.com d'usurper simplement l'en-tête Origin: http://foo.com
pour demander des pages à bar?
javascript
ajax
http
cors
Jay Lamont
la source
la source
foo.com
) doit fournir l'en-Access-Control-Allow-Origin
tête, sinon le navigateur n'autorise pas la demandebar.com
.Réponses:
Les navigateurs contrôlent la définition de l'en-
Origin
tête et les utilisateurs ne peuvent pas remplacer cette valeur. Vous ne verrez donc pas l'en-Origin
tête usurpé à partir d'un navigateur. Un utilisateur malveillant pourrait créer une requête curl qui définit manuellement l'en-Origin
tête, mais cette requête proviendrait de l'extérieur d'un navigateur et pourrait ne pas avoir d'informations spécifiques au navigateur (telles que les cookies).N'oubliez pas: CORS n'est pas la sécurité. Ne comptez pas sur CORS pour sécuriser votre site. Si vous diffusez des données protégées, utilisez des cookies ou des jetons OAuth ou autre chose que l'en-
Origin
tête pour sécuriser ces données. L'en-Access-Control-Allow-Origin
tête dans CORS dicte uniquement les origines qui doivent être autorisées à faire des demandes d'origine croisée. Ne comptez pas dessus pour rien de plus.la source
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 correspondreOrigin
exactement à la valeur envoyée dans la demande. Ils correspondent, donc j'ai été surpris quand j'ai vu le message suivant dans Chrome: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 étaithttp://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.la source
There's nothing stopping malicious code from spoofing the origin
-> Oui, javascript ne peut pas être définiOrigin
. Oui, un utilisateur peut modifier son navigateur / utiliser un violoneux pour changer l'origine, mais ce n'est pas ce contre quoi CORS se défend; Les sites Web contrôlés par des attaquants ne peuvent pas modifier l'origine, c'est tout ce qui compte.Juste un humble résumé:
Q: La politique de même origine (SOP) est-elle appliquée uniquement par les navigateurs?
R: Oui. Pour tous les appels que vous effectuez dans un navigateur, le SOP est définitivement appliqué par le navigateur. Le serveur peut ou non vérifier l'origine de la demande.
Q: Si une demande n'est pas conforme aux SOP, le navigateur la bloque-t-elle?
R: Non, cela dépasse l'autorité des navigateurs. Les navigateurs envoient simplement des requêtes d'origine croisée et attendent la réponse pour voir si l'appel est signalé légitime par le serveur via les en
Access-Control
-têtes - *. Si le serveur ne renvoie pas l'en-Access-Control-Allow-Origin
tête, ne renvoie pas l'origine de l'appelant ou ne renvoie pas l'*
en-tête, alors tout ce qu'un navigateur fera est de s'abstenir de fournir la réponse à l'appelant.Q: Cela signifie-t-il que je ne peux pas usurper
Origin
?R: Dans le navigateur et à l'aide de scripts, vous ne pouvez pas remplacer
Origin
car il est sous le contrôle du navigateur. Cependant, si vous souhaitez vous pirater, vous pouvez falsifier les appels sortant de VOTRE navigateur à l'aide d'extensions de navigateur ou d'autres outils que vous installez sur votre machine. Vous pouvez également émettre desHTTP
appels à l' aidecurl
,Python
,C#
, etc et modifier l' en-Origin
tête pour les serveurs trick.Q: Donc, si je peux tromper le serveur en le modifiant
Origin
, cela signifie-t-il qu'ilCORS
n'est pas sécurisé?R: en
CORS
soi, il est silencieux sur la sécurité - c'est-à-dire l'authentification et l'autorisation des demandes. C'est aux serveurs d'inspecter les demandes et de les authentifier / les autoriser par tout mécanisme avec lequel ils travaillent, comme les cookies et les en-têtes. Cela dit, cela peut nous protéger un peu plus en cas d'attaques comme XSS:Exemple: disons que vous vous êtes connecté à votre site Web et qu'un script malveillant tente d'envoyer une requête au site Web de votre banque pour demander votre solde: une attaque Reflected XSS . Le site Web de votre banque fait confiance aux informations d'identification provenant de (ici au nom de) votre site Web afin que la demande soit authentifiée et qu'une
HTTP
réponse visant le code malveillant soit émise. Si le site Web de votre banque ne se soucie pas de partager ses points de terminaison avec d'autres origines, il n'inclut pasAccess-Control-Allow-Origin
en-tête dans la réponse. Désormais, à l'arrivée de la requête, le navigateur se rend compte que la requête était une requête Cross Origins, mais la réponse ne montre pas que le serveur était heureux de partager la ressource (ici le point de terminaison de la requête d'équilibre) avec votre site Web. Donc, cela brise le flux, donc le résultat retourné n'atteindra jamais le code malveillant.la source