web-dev-qa-db-fra.com

Meilleure méthode: Domaines d'origine multiples à contrôle d'accès autorisé

Cette question a déjà été posée ici auparavant et a donné un éventail de bonnes réponses, principalement: Domaines d'origine multiples d'origine-Contrôle-Autoriser-Autoriser?

Cependant, il semble y avoir une lacune dans l'explication de la méthode approuvée qui devrait être entreprise. En parcourant la documentation W3, nous avons ce qui me semble être un conflit d’orientation. 

Premièrement, nous voyons la réponse donnée comme le moyen right de le faire dans un grand nombre de réponses précédentes, qui indique que le serveur hôte doit répercuter de manière dynamique le "Origine" donné s'il apparaît sur une "liste blanche" prédéfinie. http://www.w3.org/TR/cors/#resource-implementation

Cependant, beaucoup de réponses et de méthodes utilisées font également allusion à une liste délimitée par des espaces qui peut également être utilisée comme méthode de transmission de plusieurs "Origines" à autoriser. Si nous examinons un autre élément de la documentation W3 à l’adresse http://www.w3.org/wiki/CORS_Enabled , nous en voyons un exemple dans la première section de la page: 

 Access-Control-Allow-Origin: http://example.com:8080 http://blah.example.com http://foo.example.com

Je serais tout aussi heureux d’incorporer ces deux méthodes, mais il se peut qu’il y ait une longue liste d’URL qu’il faudra répertorier. C’est pourquoi j’ai voulu faire en sorte que je le fasse correctement la première fois. Si quelqu'un a un aperçu des deux méthodes mentionnées ci-dessus, je vous serais très reconnaissant d'entendre la décision dans vos choix et s'il existe un guide définitif de la méthode recommandée que j'ai peut-être manquée.

29
JonnyIrving

La documentation à ce sujet semble impliquer qu'elle autorise plusieurs origines avec une liste séparée par des espaces, mais ce n'est pas ce que cela signifie réellement. Voici ce que je pourrais rassembler comme réponse la plus définitive à votre question: l'en-tête Access-Control-Allow-Origin devrait avoir la même valeur que l'en-tête Origin aussi longtemps que vous le souhaitez.

La raison pour laquelle ce n'est pas une liste blanche que vous renvoyez au client est parce que techniquement, le client peut envoyer une liste d'origines séparée par des espaces afin que le serveur puisse valider la demande. Le but de la liste d'origine est alors parce que la demande pourrait provenir de plusieurs origines (c'est-à-dire que la demande a été redirigée sur plusieurs domaines). Une suite de tests facilite l'observation de ce comportement avec différentes possibilités de redirection, même si une liste d'espaces séparés n'est jamais générée (au moins par Firefox).

Ceci est illustré plus bas dans le premier document lié du W3C vous avez fourni:

L'en-tête Access-Control-Allow-Origin indique si une ressource peut être partagée en renvoyant la valeur de l'en-tête de la demande Origin, "*" ou "null" dans la réponse. ABNF:

Access-Control-Allow-Origin = "Accès-Control-Allow-Origin" ":" Origine-liste-ou-null | "*"

En pratique, la production Origin-list-or-null est plus contrainte. Plutôt que de permettre une liste d'origines séparée par des espaces, il s'agit d'une seule origine ou de la chaîne "null".

Et encore dans la définition de la liste d’origine . En outre, il indique que si vous souhaitez autoriser la chaîne "null" en tant qu'origine, elle ne pourra de toute façon pas être incorporée dans une liste d'origine.

Restez donc avec l'en-tête généré dynamiquement en fonction de l'en-tête Origin du client et indiquez s'il correspond à votre liste blanche.

37
Pluto

Si vous devez autoriser une origine contenant un "exemple" de mot spécifique, vous pouvez utiliser la configuration suivante dans votre serveur virtuel Apache.

SetEnvIf Origin "^((?:https?:\/\/)?(?:[^@\n]+@)?(?:www.)?.example?.*)" REFERER=$0 
Header always set Access-Control-Allow-Origin %{REFERER}e env=REFERER

Cela satisfera à certaines des conditions d'origine suivantes:

http://abc.bcd.example.com
https://www.example.in 
http://abcdexample.com 
many more

Vous pouvez modifier la regex ci-dessus selon vos besoins.

0
Sandeep M