CORS Checker - test preflight, Access-Control-Allow-Origin and credentials | POLPROG Aller au contenu

CORS Checker FREE

Find out whether a browser would let your code read an API response, and exactly which check blocks it. Real preflight and request diagnostics, not a header dump.

Gratuit Sans inscription Respect de la vie privée
Décrivez la requête que fait votre code

L'URL est le point de terminaison que votre code appelle. L'origine est le site sur lequel ce code s'exécute : un schéma, un hôte et un port, sans chemin.

Options avancées
En-têtes de requête

Ajoutez les en-têtes que votre code définit. Pour l'analyse du preflight, c'est le nom qui compte : le navigateur annonce le nom, jamais la valeur, un token n'est donc pas nécessaire et ne doit pas être collé ici.

Courants :
Ce qu'il faut tester

Une origine par ligne, dix au maximum. Utile pour vérifier que le local, la préproduction et la production figurent tous sur la liste d'autorisation. Les résultats apparaissent sous forme de tableau dans l'onglet En-têtes.

Ces requêtes sont envoyées depuis les serveurs POLPROG vers le point de terminaison que vous indiquez, parce qu'un navigateur ne peut pas exécuter ce diagnostic sur lui-même : c'est justement CORS qui l'en empêcherait. Aucun de vos cookies n'est transmis, aucun corps de requête n'est jamais envoyé, les corps de réponse sont jetés, et rien n'est conservé une fois le rapport arrivé jusqu'à vous.

Référence

CORS, en bref

01

Ce qu'est CORS

Une règle de navigateur, pas de serveur. Quand du JavaScript hébergé sur une origine demande une ressource sur une autre, le navigateur envoie la requête mais refuse de remettre la réponse à votre code, sauf si le serveur déclare, dans ses en-têtes de réponse, que l'origine qui fait la requête a le droit de la lire. Cross-Origin Resource Sharing est l'ensemble des en-têtes qui servent à le déclarer.

02

Seuls les navigateurs l'appliquent

Si une requête fonctionne dans curl, Postman, Insomnia ou depuis votre propre backend, cela ne dit rien de la capacité du JavaScript d'un navigateur à la lire. Ces clients n'appliquent aucune règle CORS. Le serveur se comporte en général de façon identique dans les deux cas ; la différence tient entièrement à ce que l'appelant fait de la réponse.

03

Ce qu'est un preflight

Pour tout ce qui n'est pas une requête des plus simples, le navigateur envoie d'abord une requête OPTIONS pour demander si la requête réelle est autorisée. Elle porte Origin, Access-Control-Request-Method et, si nécessaire, Access-Control-Request-Headers. Si la réponse n'autorise pas la requête, la requête réelle n'est jamais envoyée : le point de terminaison ne la voit donc jamais et les journaux de votre serveur ne montrent rien.

04

Quelles requêtes évitent le preflight

Une requête n'est simple que si sa méthode est GET, HEAD ou POST et que chaque en-tête qu'elle définit figure sur la safelist CORS : Accept, Accept-Language, Content-Language, Content-Type et Range. La valeur compte aussi. Content-Type ne reste sur la safelist que pour application/x-www-form-urlencoded, multipart/form-data et text/plain.

05

Pourquoi application/json déclenche un preflight

Il ne fait pas partie des trois types de contenu de la safelist. C'est toute la raison. Un POST avec un corps JSON est une requête avec preflight, et c'est pourquoi ajouter une API JSON à une page existante produit soudain une requête OPTIONS que personne n'a écrite, ainsi que des erreurs venant d'une route qui ne gère que POST.

06

Access-Control-Allow-Origin

Soit une seule origine, soit *. Jamais une liste, jamais une valeur avec un chemin, jamais un joker à l'intérieur d'un nom d'hôte. La comparaison avec l'origine qui fait la requête est exacte : une barre oblique finale, un port par défaut écrit en toutes lettres, ou http là où la requête utilisait https feront tous échouer la comparaison tout en paraissant identiques à un humain.

07

Access-Control-Allow-Credentials

Nécessaire quand la requête envoie des cookies ou une authentification HTTP. Sa seule valeur acceptée est la chaîne exacte true, en minuscules. Une requête avec identifiants ne peut pas non plus être satisfaite par Access-Control-Allow-Origin: *, et pour cette même requête un astérisque dans Allow-Methods, Allow-Headers ou Expose-Headers cesse d'être un joker et devient un nom littéral.

08

Pourquoi Vary: Origin compte

Si le serveur choisit la valeur d'Allow-Origin à partir de la requête entrante, la réponse dépend de l'en-tête Origin, et il faut le dire à tout cache partagé. Sans Vary: Origin, un CDN ou un proxy inverse peut stocker une réponse qui nomme une origine et la servir à une autre : des requêtes échouent alors pour des raisons qui n'apparaissent jamais dans l'application.

09

Lire les en-têtes de réponse

Une réponse cross-origin n'expose que sept en-têtes au script : Cache-Control, Content-Language, Content-Length, Content-Type, Expires, Last-Modified et Pragma. Tout le reste, y compris vos propres en-têtes X- et Location, se lit comme null tant qu'il n'est pas nommé dans Access-Control-Expose-Headers. Cet en-tête concerne la réponse et n'a rien à voir avec Allow-Headers, qui concerne la requête.

10

CORS n'est ni de l'authentification, ni de l'autorisation, ni une protection CSRF

Il décide quelles origines peuvent lire une réponse dans un navigateur. Il ne décide pas qui a le droit d'appeler un point de terminaison, il n'accorde aucune permission, et il n'empêche pas la falsification de requête inter-sites : une attaque CSRF n'a pas besoin de lire la réponse, une politique CORS stricte la laisse donc intacte. Gardez l'authentification, l'autorisation et les tokens CSRF exactement tels qu'ils étaient.

Portée et limites

Ce que couvre cette analyse

De vraies requêtes, et les limites de ce qu'elles montrent

Chaque verdict présenté ici provient d'un échange réel avec le point de terminaison que vous avez indiqué, évalué selon les règles du Fetch standard qu'applique un navigateur. Il décrit ce point de terminaison tel qu'il a répondu à l'infrastructure POLPROG à cet instant : un serveur dont la réponse varie selon le réseau, la région ou l'authentification peut répondre autrement à votre navigateur. Les temps sont observés depuis notre infrastructure et ne sont pas une mesure de navigateur. Le test de la requête réelle est désactivé par défaut pour les méthodes qui peuvent modifier des données, et aucun corps de requête n'est jamais envoyé.

Aide

FAQ

Pourquoi mon API fonctionne-t-elle dans Postman mais échoue-t-elle dans le navigateur ?

Parce que CORS est appliqué par les navigateurs et par rien d'autre. Postman, curl, Insomnia et votre propre backend n'appliquent aucune règle CORS : ils reçoivent la réponse quels que soient les en-têtes qu'elle porte. Le serveur se comporte en général de façon identique dans les deux cas. La différence tient entièrement à ce que l'appelant fait de la réponse, et un navigateur refuse de la remettre à votre JavaScript tant que cette réponse ne dit pas que l'origine en question a le droit de la lire.

Qu'est-ce qu'une requête preflight ?

Une requête OPTIONS que le navigateur envoie avant la requête réelle, pour demander si celle-ci est autorisée. Elle porte Origin, Access-Control-Request-Method et, si nécessaire, Access-Control-Request-Headers. Si la réponse n'autorise pas la requête, la requête réelle n'est jamais envoyée : votre point de terminaison ne la voit donc jamais et les journaux de votre serveur ne montrent rien. Seules les requêtes qui ne sont pas simples passent par un preflight.

Pourquoi application/json déclenche-t-il un preflight alors que text/plain n'en déclenche pas ?

Content-Type ne figure sur la safelist CORS que pour application/x-www-form-urlencoded, multipart/form-data et text/plain. Ces trois-là, et rien d'autre. Un corps JSON place la requête hors de la safelist, le navigateur l'annonce donc à l'avance. C'est pourquoi ajouter une API JSON à une page existante produit soudain une requête OPTIONS que personne n'a écrite.

Pourquoi ne puis-je pas utiliser Access-Control-Allow-Origin: * avec des identifiants ?

Parce qu'une réponse liée à un utilisateur connecté ne doit pas être lisible par tous les sites que cet utilisateur visite. Quand une requête envoie des cookies ou une authentification HTTP, le serveur doit nommer l'origine à laquelle il fait confiance, et un navigateur rejette le joker sans appel, même accompagné d'Access-Control-Allow-Credentials: true. Il en va de même pour un astérisque dans Allow-Methods, Allow-Headers et Expose-Headers : pour une requête avec identifiants, chacun est lu comme un nom d'en-tête littéral et non comme un joker.

CORS protège-t-il mon API ?

Non. CORS décide quelles origines peuvent lire une réponse dans un navigateur. Ce n'est pas de l'authentification, il n'accorde aucune permission, et il n'empêche pas la falsification de requête inter-sites, parce qu'une attaque CSRF n'a pas besoin de lire la réponse. Tout client qui n'est pas un navigateur l'ignore complètement. Gardez votre authentification, vos vérifications d'autorisation et vos tokens CSRF exactement tels qu'ils sont.

D'où viennent ces requêtes, et qu'est-ce qui est conservé ?

Des serveurs POLPROG vers le point de terminaison que vous indiquez, parce qu'un navigateur ne peut pas exécuter ce diagnostic sur lui-même : c'est justement CORS qui l'en empêcherait. Seuls les en-têtes nécessaires à l'analyse sont envoyés, aucun de vos cookies n'est transmis, aucun corps de requête n'est jamais envoyé, et les corps de réponse sont jetés. Rien n'est conservé une fois le rapport arrivé jusqu'à vous, et les valeurs des en-têtes sensibles comme Authorization ne sont jamais affichées ni exportées.

Créez un meilleur web, plus vite.

Nous développons des logiciels et des solutions sur mesure adaptés à vos besoins.

Nous contacter