Comment Access-Control-Allow-Origin-tête de travail?
Apparemment, j'ai complètement mal compris sa sémantique. J'ai pensé à quelque chose comme ceci:
- Un client télécharge le code javascript MyCode.js à partir de http://siteA - l'origine.
- L'en-tête de réponse de MyCode.js contient Access-Control-Allow-Origin: http://siteB, ce qui signifiait que je pensais MyCode.js été autorisé à faire de la croix-origine renvois vers le site B.
- Le client déclenche certaines fonctionnalités de MyCode.js qui, à son tour faire des demandes de http://siteB qui doit être fine, en dépit de la croix-de l'origine des demandes.
Bien, je suis dans l'erreur. Il ne fonctionne pas comme ça à tout. Donc, j'ai lu Cross-origin resource sharing et a tenté de lire Cross-Origin Resource sharing dans la recommandation du w3c
Une chose est sûr - je ne comprends toujours pas comment suis-je censé utiliser cet en-tête.
J'ai le plein contrôle de fois le site A et le site b. Comment puis-je activer le javascript code téléchargé à partir du site Un accès à des ressources sur le site B à l'aide de cet en-tête?
P. S.
Je ne veux pas utiliser JSONP.
- Je ne suis pas sûr, mais je crois que le réglage de l'en-tête de cette façon vous code sur le site B pour aller chercher
http://siteA/MyCode.js
. - Mais comment??? Afin d'obtenir la valeur d'en-tête a chercher la ressource première, mais la ressource est de la croix-origine et donc ne devrait pas le navigateur de bloquer la demande en premier lieu?
- Ce que vous avez décrit en fait ressemble à une autre pratique, Contenu de la Politique de Sécurité
- Vous n'avez pas à aller chercher les ressources afin d'obtenir les en-têtes. L'en-TÊTE HTTP de la méthode sera de retour les en-têtes uniquement. Et dans le cas de la SCRO, un contrôle en amont est effectué en utilisant les OPTIONS HTTP méthode qui ne retourne pas le corps. apsillers réponse décrit ce bien stackoverflow.com/posts/10636765/revisions.
Vous devez vous connecter pour publier un commentaire.
Access-Control-Allow-Origin
est un CORS (Cross-Origin Resource sharing) de la tête.Lorsqu'Un Site tente d'extraire le contenu du Site B, le Site B peut envoyer un
Access-Control-Allow-Origin
en-tête de réponse de dire au navigateur que le contenu de cette page est accessible à certaines origines. (Un origine est un domaine, en plus d'un régime et le numéro de port.) Par défaut, le Site B de pages sont pas accessible à tout autre origine; à l'aide de laAccess-Control-Allow-Origin
en-tête ouvre une porte pour la croix-origine de l'accès par spécifiques demandant des origines.Pour chaque ressource/page Site B veut rendre accessible à Un Site, le Site B, doit servir de ses pages avec l'en-tête de réponse:
Les navigateurs modernes ne va pas bloquer les demandes inter-domaine d'emblée. Si Un Site demande une page du Site B, le navigateur va effectivement chercher la page demandée au niveau du réseau et de vérifier si les en-têtes de réponse liste de Site Un en tant que demandeur de permis de domaine. Si le Site B n'a pas indiqué que le Site A est autorisé à accéder à cette page, le navigateur va déclencher l'
XMLHttpRequest
'serror
de l'événement et de refuser les données de réponse à la demande de code JavaScript.Non de simples demandes
Ce qui se passe au niveau du réseau peut être légèrement plus complexe qu'expliqué ci-dessus. Si la demande est une "non simple" demande, le navigateur envoie d'abord des données moins "contrôle en amont" des OPTIONS de demande, pour vérifier que le serveur accepte la demande. Une demande est non simple lorsque l'un ou l'autre (ou les deux):
Accept
Accept-Language
Content-Language
Content-Type
(ce n'est simple lorsque sa valeur estapplication/x-www-form-urlencoded
,multipart/form-data
, outext/plain
)Si le serveur répond aux OPTIONS de contrôle en amont avec appropriée en-têtes de réponse (
Access-Control-Allow-Headers
pour les non-têtes simples,Access-Control-Allow-Methods
pour les non-simple des verbes) qui correspondent à la non-verbe simple et/ou non-des en-têtes simples, puis le navigateur envoie la demande réelle.À supposer que le Site A veut envoyer une demande de
/somePage
, avec une non-simpleContent-Type
valeur deapplication/json
, le navigateur d'abord envoyer une demande de contrôle en amont:Noter que
Access-Control-Request-Method
etAccess-Control-Request-Headers
sont ajoutés par le navigateur automatiquement; vous n'avez pas besoin de les ajouter. Cette option contrôle en amont obtient le succès des en-têtes de réponse:Lors de l'envoi de la demande réelle (après contrôle en amont est fait), le comportement est identique à la façon dont une simple demande est traitée. En d'autres termes, un non-simple demande dont elle est réussie, est traité de la même façon comme une simple demande (c'est à dire, le serveur doit toujours envoyer
Access-Control-Allow-Origin
encore pour la réponse réelle).Les navigateurs envoie la demande réelle:
Et le serveur renvoie un
Access-Control-Allow-Origin
, tout comme il le ferait pour une simple demande:Voir La compréhension XMLHttpRequest au cours de la SCRO pour un peu plus d'informations à propos de la non-simple demande.
Access-Control-Allow-Origin
en-tête, mais il pourrait ne pas fournir la réponse pour le code JS sur le site si la tête ne permet pas Un site pour l'avoir. (P. S. Merci 🙂 )Access-Control-Allow-Origin
n'accepte pas la*
dans certains navigateurs (FF et Chrome autant que je sache). Dans ce cas, vous devez spécifier la valeur de laOrigin
en-tête. Espérons que cela va aider quelqu'un.*
" ne peut pas être utilisé pour une ressource qui prend en charge les informations d'identification."). Voir aussi Ne peut pas utiliser des caractères génériques dans Access-Control-Allow-Origin lorsque les informations d'identification indicateur est vraihttps://google.com/auth?token=...&redirect=...
d'une manière qui ne cause pas un cross-origin demande.access-control-allow-origin
dynamiquement (modification de l'URL de la valeur basée sur la demande de l'origine) au lieu de*
, vous devez également inclure l'en-têteVary: Origin
. Voir fetch.spec.whatwg.org/#cors-protocol-and-http-cachesDe la croix-Origine de la Demande de Partage -
CORS
(A. K. A. de la Croix-Domaine requête AJAX) est un problème que la plupart des développeurs web peuvent rencontrer, selon la Même Origine Politique, les navigateurs restreindre client JavaScript dans un sandbox de sécurité, généralement JS ne peut pas communiquer directement avec un serveur distant à partir d'un domaine différent. Dans le passé, les développeurs ont créé plusieurs manières délicates à réaliser inter-Domaine de la demande de ressource, le plus souvent à l'aide de moyens sont:avec la télécommande.
Ces manières délicates ont plus ou moins certaines questions, par exemple JSONP pourrait résulter en un trou de sécurité si les développeurs simplement "eval", et #3 ci-dessus, bien que cela fonctionne, les deux domaines doivent construire stricte contrat entre les uns des autres, ni souple, ni élégant à mon humble avis:)
W3C avait introduit Cross-Origin Resource sharing (SCRO) comme une solution standard pour fournir un coffre-fort, souple et d'une norme recommandée façon de résoudre ce problème.
Le Mécanisme
D'un niveau élevé, on peut juger de la SCRO est un contrat entre le client appel AJAX à partir d'Un domaine et d'une page hébergée sur le domaine B, typique de la Croix-Origine de requête/réponse serait:
DomainA AJAX en-têtes de requête
DomainB en-têtes de réponse
Les parties bleues que j'ai marqué ci-dessus ont été le kernel faits, "Origine" en-tête de requête "indique l'endroit où la croix-origine de la demande ou de contrôle en amont la demande provient de", le "Access-Control-Allow-Origin" en-tête de réponse indique cette page permet à distance de la demande de DomainA (si la valeur est * permet d'indiquer les demandes à distance à partir de n'importe quel domaine).
Comme je l'ai mentionné ci-dessus, W3 navigateur recommandé de mettre en œuvre un "de contrôle en amont demande" avant de soumettre la réalité de la Croix-Origine de la requête HTTP, en un mot c'est un HTTP
OPTIONS
demande:Si foo.aspx prend en charge les OPTIONS HTTP verbe, il risque de retourner la réponse, comme ci-dessous:
Seulement si la réponse contient "Access-Control-Allow-Origin" ET sa valeur est "*" ou contiennent le domaine qui a présenté la SCRO demande, par la satisfaction de ce mandtory condition navigateur de soumettre la demande de domaines et de mettre en cache le résultat en "de contrôle en amont-Résultat-Cache".
J'ai blogué à propos de la SCRO il y a trois ans: AJAX Cross-Origine de la requête HTTP
Question est un peu trop vieux pour répondre, mais je vous poste ça pour toute référence future à cette question.
Selon cette Mozilla Developer Network article,
Un page HTML servi de
http://domain-a.com
fait une<img>
src demande dehttp://domain-b.com/image.jpg
.De nombreuses pages sur le web aujourd'hui de charger des ressources telles que les feuilles de style CSS, images et scripts de domaines distincts (donc il doit être froid).
De Même Origine Politique
Pour des raisons de sécurité, les navigateurs restreindre cross-origin HTTP demandes initié de l'intérieur des scripts.
Par exemple,
XMLHttpRequest
etFetch
suivez les de même origine politique.Ainsi, une application web à l'aide de
XMLHttpRequest
ouFetch
ne pouvait faire requêtes HTTP à son propre domaine.Cross-Origin Resource sharing (SCRO)
Pour améliorer les applications web, les développeurs demandé aux fournisseurs de navigateur pour autoriser les requêtes inter-domaine.
La Cross-Origin Resource sharing (SCRO) mécanisme donne des serveurs web de la croix-domaine des contrôles d'accès, qui permet de sécuriser la croix-domaine des transferts de données.
Les navigateurs modernes utilisent de la SCRO dans un API conteneur - comme
XMLHttpRequest
ouFetch
- pour atténuer les risques de la croix-origine des requêtes HTTP.Comment la SCRO œuvres (
Access-Control-Allow-Origin
en-tête)Wikipédia:
Exemple
Le navigateur envoie le
OPTIONS
demande avec unOrigin HTTP
en-tête.La valeur de cet en-tête est le domaine qui a servi en de la page parent. Lorsque une page de
http://www.example.com
tentatives d'accès à des données d'un utilisateur dansservice.example.com
, les suivantes en-tête de demande sera envoyé àservice.example.com
:Origine: http://www.example.com
Le serveur à
service.example.com
peut répondre:Un
Access-Control-Allow-Origin
(ACAO) de la tête à sa réponse en indiquant quels sites d'origine sont autorisées.Par exemple:
Access-Control-Allow-Origin: http://www.example.com
Une page d'erreur si le serveur n'autorise pas la croix-origine de la demande
Un
Access-Control-Allow-Origin
(ACAO) de la tête avec un joker qui permet à tous les domaines:Access-Control-Allow-Origin: *
Access-Control-Allow-Origin:null
Access-Control-Allow-Origin
? Je veux dire la négation deAccess-Control-Allow-Origin: *
Chaque fois que je commence à penser de la SCRO, mon intuition sur le site héberge les en-têtes est incorrect, juste comme vous l'avez décrit dans votre question. Pour moi, ça m'aide à réfléchir à la finalité de la même origine.
L'objet de la même origine, la politique est de vous protéger d'un programme malveillant siteA.com accéder aux informations privées que vous avez choisi de partager avec siteB.com. Sans la même origine, JavaScript écrit par les auteurs de siteA.com peut rendre votre navigateur faire des demandes de siteB.com à l'aide de votre cookies d'authentification pour siteB.com. De cette façon, siteA.com pourrait voler le secret de l'information que vous partagez avec siteB.com.
Parfois, vous avez besoin de travailler de la croix de domaine, qui est l'endroit où la SCRO vient dans. La SCRO détend la même origine pour domainA.com en utilisant le
Access-Control-Allow-Origin
en-tête de liste d'autres domaines (domainB.com) qui sont de confiance pour exécuter le JavaScript qui peut interagir avec domainA.com.Pour comprendre le domaine qui devrait servir de la SCRO en-têtes, considérez ceci. Vous visitez malicious.com qui contient du JavaScript qui tente de faire une croix domaine demande à mybank.com. Il devrait être à mybank.com, pas malicious.com, de décider si oui ou non il définit la SCRO en-têtes de détendre la même origine politique permettant le JavaScript à partir de malicious.com pour interagir avec elle. Si malicous.com pourrait définir sa propre CORS en-têtes permettant à ses propres JavaScript accès à mybank.com ce serait annuler complètement la même origine.
Je pense que la raison de ma mauvaise intuition est le point de vue que j'ai lors de l'élaboration d'un site. C'est mon site, avec tous les mon JavaScript, il n'est donc pas de faire quoi que ce soit malveillant et il devrait être à moi pour spécifier d'autres sites mon JavaScript peut interagir avec. Alors qu'en fait, je devrais être en train de penser qui autres sites JavaScript, essayez d'interagir avec mon site et que je devrais utiliser de la SCRO pour leur permettre?
À l'aide de Réagir et Axios, rejoignez proxy lien vers l'URL et ajouter un en-tête comme indiqué ci-dessous
https://cors-anywhere.herokuapp.com/
+Your API URL
Simplement en ajoutant l'Proxy lien fonctionnera, mais il peut aussi jeter erreur d'Aucun Accès à nouveau. Par conséquent préférable d'ajouter un en-tête comme indiqué ci-dessous.
Si vous voulez juste tester une croix domaine d'application dans lequel le navigateur bloque votre demande, vous pouvez simplement ouvrir votre navigateur en mode non sécurisé et tester votre application sans modification de votre code, et sans faire de votre code dangereux.
À partir de MAC OS, vous pouvez le faire à partir de la ligne de terminal:
1. Un client télécharge le code javascript MyCode.js de http://siteA - l'origine.
Le code que le téléchargement - code html, balise de script ou xhr de javascript ou autre - est venu à partir de, disons, http://siteZ. Et, lorsque le navigateur demande MyCode.js il envoie une Origine: la tête en disant: "Origine: http://siteZ", car il peut voir ce que vous demandez à siteA et siteZ != siteA. (Vous ne pouvez pas arrêter ou interférer avec cela.)
2. L'en-tête de réponse de MyCode.js contient Access-Control-Allow-Origin: http://siteB, ce qui signifiait que je pensais MyCode.js été autorisé à faire de la croix-origine renvois vers le site B.
pas. Cela signifie, Seulement siteB est autorisé à faire cette demande. Si votre demande de MyCode.js à partir siteZ obtient une erreur au lieu de cela, et le navigateur généralement vous donne rien. Mais si vous faites votre serveur de retour A-C-A-O: siteZ au lieu de cela, vous aurez MyCode.js . Ou si il envoie '*', qui marche, qui va permettre à tout le monde en. Ou si le serveur envoie la chaîne de caractères à partir de l'Origine: en-tête... mais... pour la sécurité, si vous avez peur des pirates, votre serveur doit autoriser uniquement les origines sur une liste restreinte, qui sont autorisés à faire ces demandes.
Puis, MyCode.js vient de siteA. Quand il fait des demandes à siteB, ils sont tous de la croix-origine, le navigateur envoie Origine: siteA, et siteB a prendre le siteA, de reconnaître qu'il est sur la liste des admis aux demandeurs, et de la renvoyer A-C-A-O: siteA. Alors seulement, le navigateur laissez votre script obtenez le résultat de ces demandes.
je travaille avec express 4 et le nœud de 7,4 et angulaire,j'ai eu le même problème m'aider ce:
a) côté serveur: dans le fichier app.js je donne des en-têtes à toutes les réponse, comme:
cela doit avoir avant tout le routeur.
J'ai vu beaucoup de ce les en-têtes:
mais je n'ai pas besoin qu'
b) côté client: dans envoyer ajax vous avez besoin d'ajouter: "withCredentials: true," comme:
bonne chance.
Si vous utilisez PHP, essayez d'ajouter le code suivant au début du fichier php:
Si vous utilisez localhost, essayez ceci:
Si vous utilisez des domaines externes tels que les serveur, essayez ceci:
En Python, j'ai été en utilisant le
Flacon de la SCRO
de la bibliothèque avec un grand succès. Il fait affaire avec la SCRO super facile et indolore. J'ai ajouté un peu de code à partir de la bibliothèque de la documentation ci-dessous.Installation:
Exemple Simple qui permet de la SCRO pour tous les domaines sur toutes les routes:
Pour des exemples plus spécifiques, consultez la documentation. J'ai utilisé l'exemple simple ci-dessus pour obtenir autour de la question de la SCRO dans un ioniques application que je suis bâtiment qui a accès à un flacon séparé serveur.
Pour l'origine de la croix de partage, de définir l'en-tête:
'Access-Control-Allow-Origin':'*';
Php:
header('Access-Control-Allow-Origin':'*');
Nœud:
app.use('Access-Control-Allow-Origin':'*');
Cela va permettre de partager des contenus de domaines différents.
Il suffit de coller le code suivant dans votre site web.fichier de configuration.
A noté que, vous devez coller le code suivant sous
<system.webServer>
tagPour plus d'info, visitez ici....