Aller au contenu principal

2. En-tête X-Frame-Options

2. En-tête X-Frame-Options

Le champ d'en-tête HTTP X-Frame-Options indique une politique qui spécifie si le navigateur doit rendre la ressource transmise dans un <frame> ou un <iframe>. Les serveurs peuvent déclarer cette politique dans l'en-tête de leurs réponses HTTP pour prévenir les attaques de détournement de clic (clickjacking), ce qui garantit que leur contenu n'est pas intégré dans d'autres sites.

2.1 Syntaxe

Le nom du champ d'en-tête est:

X-Frame-Options

Il existe trois valeurs différentes pour le champ d'en-tête. Celles-ci sont mutuellement exclusives; c'est-à-dire que le champ d'en-tête DOIT être défini sur exactement l'une des trois valeurs.

DENY

Un navigateur recevant du contenu avec ce champ d'en-tête NE DOIT PAS afficher ce contenu dans un cadre quelconque.

SAMEORIGIN

Un navigateur recevant du contenu avec ce champ d'en-tête NE DOIT PAS afficher ce contenu dans un cadre d'une page d'origine différente de celle du contenu lui-même. Si un navigateur ou un plugin ne peut pas déterminer de manière fiable si l'origine du contenu et du cadre sont identiques, cela DOIT être traité comme "DENY".

Veuillez noter que les implémentations actuelles varient dans l'interprétation de ce critère. Dans certaines, il est seulement requis que l'origine du contexte de navigation de niveau supérieur corresponde à l'origine du contenu utilisant la directive X-Frame-Options; dans d'autres, ce critère doit être satisfait pour tous les contextes de navigation ancêtres. Pour plus de détails sur l'imbrication des cadres et les variations du comportement de ce champ d'en-tête dans différents navigateurs, voir la section 2.3.2.2. De plus, référez-vous à la section 4, paragraphe 2 pour les problèmes de sécurité potentiels qui peuvent en résulter.

ALLOW-FROM (suivi d'une origine sérialisée [RFC6454])

Un navigateur recevant du contenu avec ce champ d'en-tête NE DOIT PAS afficher ce contenu dans un cadre d'une page dont le contexte de navigation de niveau supérieur est d'une origine différente de l'origine spécifiée. Bien que cette valeur d'en-tête puisse avoir un support limité, elle est dépréciée dans les navigateurs modernes.

Notez que le champ d'en-tête X-Frame-Options DOIT être envoyé en tant que champ d'en-tête HTTP et les navigateurs ignorent spécifiquement les instances trouvées dans la balise <meta http-equiv>.

2.2 Forme de Backus-Naur augmentée (ABNF)

L'ABNF RFC 5234 [RFC5234] de la valeur du champ d'en-tête X-Frame-Options est le suivant:

id-name                = "X-Frame-Options"
X-Frame-Options = "DENY"
/ "SAMEORIGIN"
/ ( "ALLOW-FROM" RWS serialized-origin )

RWS = 1*( SP / HTAB )
; required whitespace

serialized-origin = scheme "://" host [ ":" port ]
; <scheme>, <host>, <port> as per RFC 6454

où "serialized-origin" est défini dans le RFC 6454 [RFC6454], section 6.2. La production "serialized-origin" implique que la chaîne d'origine sérialisée ne peut pas inclure d'espace blanc.

2.2.1 Exemples de X-Frame-Options

X-Frame-Options: DENY
X-Frame-Options: SAMEORIGIN
X-Frame-Options: ALLOW-FROM https://example.com/

2.3 Questions de conception

2.3.1 Activer le contenu HTML d'autres domaines

Il existe un certain nombre de vecteurs directs principaux qui permettent le contenu HTML d'autres domaines, par exemple:

  • Éléments <frame>
  • Éléments <iframe>
  • Éléments <object>
  • Éléments <applet>
  • Éléments <embed>

Outre ceux-ci, d'autres éléments peuvent être exploités pour prendre des mesures dans les cadres parents qui peuvent contribuer à une attaque de type détournement de clic, y compris la balise <script>, la balise <form> et la balise <button>, entre autres. Le champ d'en-tête X-Frame-Options fournit un mécanisme par lequel les opérateurs de sites peuvent indiquer que leurs pages ne doivent pas être intégrées dans des cadres provenant d'autres domaines, et ainsi se défendre contre les attaques de détournement de clic.

2.3.2 Comportement et traitement du navigateur

2.3.2.1 Violation de X-Frame-Options

Lorsqu'un navigateur détecte un en-tête X-Frame-Options qui empêche la page d'être rendue dans un cadre, le navigateur DOIT immédiatement cesser de rendre le document.

La page doit être traitée comme si l'utilisateur avait annulé la demande de chargement du document. Ceci est similaire à la manière dont l'agent utilisateur traite la réponse "204 No Content", bien que cette dernière n'entraîne pas de condition d'erreur.

Si le navigateur a déjà commencé à télécharger des images ou d'autres demandes de ressources incluses dans la page, le navigateur DEVRAIT tenter d'arrêter le téléchargement de ces ressources dès que possible.

2.3.2.2 Variation du comportement actuel du navigateur

Les navigateurs diffèrent dans leur interprétation de la vérification du cadre et du contexte de navigation requise lorsque le champ d'en-tête SAMEORIGIN est utilisé. Le comportement prévu est que l'agent utilisateur DOIT uniquement rendre la page dans un cadre si ce cadre est dans la même origine que la page encadrée.

Cependant, les implémentations des navigateurs diffèrent. Certaines implémentations parcourent l'arbre entier des ancêtres des contextes de navigation et exigent que chaque ancêtre soit dans la même origine. D'autres ne vérifient que le contexte de navigation de niveau supérieur (la fenêtre) provient de la même origine.

Cela signifie que, pour les pages qui sont "encadrées" à travers plusieurs pages intermédiaires (c'est-à-dire, un cadre dans un cadre dans un cadre), l'ensemble des pages qui seront rendues avec succès peut être plus restrictif (dans les implémentations qui vérifient toute la chaîne des ancêtres) ou moins restrictif (dans les implémentations qui ne vérifient que le cadre de niveau supérieur) que ce que la spécification prévoit.

Les opérateurs de sites doivent être conscients de cette différence potentielle de comportement et tester le rendu dans leur base de navigateurs attendue pour assurer la conformité avec leurs politiques anti-détournement de clic.

2.3.2.3 Modèle de conception d'utilisation et scénario d'exemple pour le paramètre ALLOW-FROM

En raison d'un support faible et d'implémentations variables entre différents navigateurs, l'option ALLOW-FROM a été dépréciée. Les opérateurs de sites DEVRAIENT envisager d'utiliser la directive frame-ancestors de Content Security Policy [CSP2] à la place, qui fournit un meilleur contrôle sur les politiques d'intégration de cadres et a un meilleur support des navigateurs.

2.3.2.4 Pas de mise en cache de l'en-tête X-Frame-Options

Les navigateurs DOIVENT traiter la valeur du champ d'en-tête X-Frame-Options pour chaque réponse HTTP, indépendamment des directives de cache présentes dans cette réponse HTTP ou des réponses précédemment mises en cache. Le champ d'en-tête est évalué au moment de la navigation et NE DOIT PAS être mis en cache. Cela garantit que la politique la plus récente est appliquée.