Confusion sur la façon dont Cross Origin Resource Sharing (CORS) fonctionne

D'après ce que j'ai compris sur CORS, c'est comme ça que ça fonctionne: j'ai un site foo.com qui sert une page X. X veut publier des données dans un autre domaine bar.com. Si bar.com est activé CORS (ses en-têtes produisent Access-Control-Allow-Origin foo.com) alors la page X peut maintenant envoyer des données à bar.com.

Comme je comprends que CORS fonctionne, il s'agit de configurer sur bar.com, et n'a rien à voir avec foo.com. Il s'agit de s'assurer que bar.com n'accepte pas les demandes d'un ancien domaine.

Cependant, cela n'a vraiment pas de sens pour moi. Je pensais que CORS avait été conçu pour permettre à foo.com de dicter avec qui X est autorisé à communiquer. Si nous revenons à l'exemple précédent, mais cette fois X est compromis par le script dodgy afin qu'il envoie des données secrètement à evil.com, comment CORS va-t-il arrêter cela? Evil.com est CORS activé et configuré sur *, donc il acceptera les demandes de tout. De cette façon, un utilisateur pensant qu'ils utilisent un site foo.com, envoie involontairement des données à evil.com.

Si c'est vraiment tout à propos de la protection de Bar.com, alors pourquoi le navigateur applique-t-il la politique? La seule situation concevable dans laquelle cela a du sens si vous avez evil.com servant la page Y qui se fait passer pour foo.com, qui essaie d'envoyer des données à bar.com. Mais CORS est appliqué par le navigateur, tout ce que vous devriez faire est de faire de evil.com un proxy qui envoie des demandes d'origine fausses à bar.com (les données vont de Y à evil.com, evil.com établit sa fausse origine vers foo .com puis l'envoie à bar.com).

Cela n'a de sens que si cela fonctionne à l'inverse. Foo.com est activé CORS, et ses en-têtes sont définis sur Access-Control-Allow-Origin bar.com. De cette façon, les scripts rouge se seraient vu refuser l'accès evil.com par le navigateur. Il est alors logique pour le navigateur d'appliquer la politique car elle exécute les scripts qui pourraient être rouges. Il n'empêchera pas les sites rouge d'essayer d'envoyer des données de rouge à bar.com, mais bar.com peut se protéger avec un nom d'utilisateur / mot de passe. Si foo.com a des points de terminaison qu'il attend des données en provenance de X, vous pouvez intégrer des jetons dans X, afin de s'assurer que evil.com n'envoie pas de données à sa place.

J'ai l'impression que je ne comprends pas quelque chose d'essentiel. J'apprécierais vraiment l'aide.

Cependant, cela n'a vraiment pas de sens pour moi. Je pensais que CORS avait été conçu pour permettre à foo.com de dicter avec qui X est autorisé à communiquer.

Non, il s'agit de bar.com qui contrôle l'utilisation de son contenu.

Mais CORS est appliqué par le navigateur, tout ce que vous devriez faire est de faire de evil.com un proxy qui envoie des demandes d'origine fausses à bar.com …

Ouaip. Et si vous le faites, et les gens à bar.com remarquent et se soucient, ils refusent les demandes de votre serveur. Vous le déplacez, ils refusent le nouveau. Whack-a-mole time. Mais aussi douloureux que ce jeu de whack-a-mole, il est beaucoup moins pénible que si les demandes viennent directement de chaque utilisateur individuel de foo.com, à partir de leur bureau.

Ayant foo.com faire respecter ce que foo.com peut faire, ça n'a aucun sens. Foo.com applique déjà ce que foo.com peut faire, car c'est foo.com qui sert le contenu et les scripts de foo.com.

Il ne s'agit pas de Foo.com, ni de Bar.com. Il s'agit de l'utilisateur.

Il existe deux choses contre lesquelles CORS protège contre. Le premier est l'accès aux ressources derrière le pare-feu. La seconde est une ressource normalement protégée, à moins qu'une demande ne soit envoyée à partir d'un navigateur avec une authentification ou d'autres cookies de données sensibles.

CORS est une technologie de navigateur , avec le soutien de serveurs, qui permet à n'importe quelle liberté limitée d'appeler en dehors de son domaine. Il s'agit d'un trou restreint perforé dans la restriction contre les scripts entre domaines.

N'importe qui peut fausser l'en-tête d'ORIGINE et créer une requête en version de commande ou simple de CORS – Bien sûr, n'importe qui peut se connecter directement au serveur de bar directement et faire les requêtes sans utiliser CORS. Tout navigateur peut se connecter directement à bar.com et obtenir des données. Mais un navigateur moderne n'exécute pas un script de foo.com qui accède à une ressource bar.com. Les personnes qui visitent les sites Web sont protégées contre la visite d'un site conçu pour exploiter les cookies ou le fait que le navigateur soit derrière le pare-feu de l'entreprise.

La réponse acceptée est donc NON PERDIENNE. Il ne s'agit pas de proposer à Bar.com la protection de ses ressources, c'est-à-dire par l'authentification et l'autorisation. Vous ne devez pas créer de proxy pour envoyer des requêtes CORS – vous créez un proxy pour éliminer les requêtes CORS (répondant automatiquement à la demande de pré-vol et renvoyez les en-têtes appropriés au navigateur, mais envoie une requête normale à la barre. Com). Mais vous aurez toujours besoin d'authentification pour obtenir les ressources de bar.com, et foo.com devrait encore vous obliger à installer un proxy pour exploiter le trou de script cross-domain que CORS protège contre.

Mais la phrase finale est correcte – foo.com n'a pas le contrôle des ressources – c'est le navigateur, avec une vérification rapide avec bar.com pour lui demander si cela est destiné.

De l'OP:

Si c'est vraiment tout à propos de la protection de Bar.com, alors pourquoi le navigateur applique-t-il la politique? La seule situation concevable dans laquelle cela a du sens si vous avez evil.com servant la page Y qui se fait passer pour foo.com, qui essaie d'envoyer des données à bar.com. Mais CORS est appliqué par le navigateur, tout ce que vous devriez faire est de faire de evil.com un proxy qui envoie des demandes d'origine fausses à bar.com (les données vont de Y à evil.com, evil.com établit sa fausse origine vers foo .com puis l'envoie à bar.com).

Evil.com peut déjà contacter bar.com – tout comme n'importe quel humain utilisant un navigateur peut (ou curl ou wget, etc.). Le problème est que evil.com force votre navigateur à se connecter à bar.com, qui peut avoir des filtres IP, des cookies, des pare-feu, etc. protégeant, mais javascript peut vous connecter à votre navigateur. Le navigateur est donc ce qui protège l'utilisateur. En refusant les scripts entre domaines. Mais parfois, il est utile (ex: google apis, ou une banque se connectant à un service de paiement de facture, etc.) au script cross-domain. CORS indique au navigateur qu'il est correct dans cette instance.

Cela ne veut pas dire qu'il n'y a pas de trous, ou la norme est la meilleure, ou qu'il n'y a pas de trous dans la mise en œuvre dans le navigateur ou que les sites sont trop permissifs. Mais ce sont des questions différentes …