FreeToGenerate.com

Exécute l’algorithme que la norme HTML spécifie réellement, y compris les cas laissés ouverts par la RFC et ceux qu’aucune table de référence ne consigne. Rien n’est envoyé.

Un en-tête par ligne. La norme précise qu’une valeur séparée par des virgules et plusieurs en-têtes distincts donnent le même résultat : les deux formes conviennent ici.

Essayez :

Le document qui envoie l’en-tête.

Une par ligne, de la plus proche à la plus lointaine : la page qui intègre la vôtre, puis celle qui intègre celle-là, jusqu’à l’onglet. Laissez vide si personne ne l’encadre.

Si une politique appliquée comporte une directive frame-ancestors, X-Frame-Options est ignoré entièrement, avant même que sa valeur soit lue.

Ce que fait un navigateur conforme

Le navigateur refuse de l’afficher

La valeur est SAMEORIGIN et un ancêtre relève d’une autre origine. La vérification remonte toute la chaîne : un seul cadre tiers, où qu’il soit, suffit.

Valeurs après découpage
sameorigin
Premier ancêtre d’une autre origine
https://widgets.partner.test

Tous les cas que la norme consigne

Voici les valeurs pour lesquelles la norme HTML publie des réponses résolues, y compris non conformes. Les verdicts sont calculés par cette page, non recopiés, et évalués face à un parent de même origine.

Valeur de l’en-têteValideRésultat
DENYUne seule valeurOuiLe navigateur refuse de l’afficher
SAMEORIGINOuiLa page peut être intégrée
INVALIDNonLa page peut être intégrée
ALLOWALLNonLa page peut être intégrée
ALLOW-FROM=https://example.com/NonLa page peut être intégrée
SAMEORIGIN, SAMEORIGINPlusieurs valeursNonLa page peut être intégrée
SAMEORIGIN, DENYNonLe navigateur refuse de l’afficher
SAMEORIGIN,NonLe navigateur refuse de l’afficher
SAMEORIGIN, ALLOWALLNonLe navigateur refuse de l’afficher
SAMEORIGIN, INVALIDNonLe navigateur refuse de l’afficher
ALLOWALL, INVALIDNonLe navigateur refuse de l’afficher
ALLOWALL,NonLe navigateur refuse de l’afficher
INVALID, INVALIDNonLa page peut être intégrée

Tout fonctionne dans votre navigateur. Rien n’est envoyé, et recharger la page efface ce que vous avez saisi.

Aussi disponible en : English · Español · Português · العربية

X-Frame-Options : ce que l’en-tête fait vraiment aujourd’hui

Collez votre en-tête et les cadres qui entourent la page, et voyez quelle étape de la norme tranche.

Qu’est-ce que X-Frame-Options ?

X-Frame-Options est un en-tête de réponse qui indique au navigateur si votre page peut s’afficher dans le cadre de quelqu’un d’autre. Il existe pour contrer le clickjacking : un attaquant intègre votre vraie page, la rend invisible et amène la victime à cliquer sur un bouton qu’elle ne voit pas. Deux valeurs seulement ont un sens : DENY refuse tout encadrement, et SAMEORIGIN ne l’autorise que depuis votre propre origine.

L’en-tête est plus ancien que le processus qui produit d’ordinaire les normes du web. Les navigateurs l’ont livré vers 2009, et la description que tout le monde cite, la RFC 7034, a été écrite quatre ans plus tard pour documenter ce qui existait déjà. Cette RFC porte la mention Informational et le dit d’elle-même dès ses premières lignes : ce n’est pas une spécification de la voie des normes de l’internet.

Autrement dit, le document vers lequel pointent la plupart des pages n’est plus celui qui régit le comportement. C’est la norme HTML qui porte désormais le modèle de traitement, et elle affirme sans détour que sa définition remplace celle de la RFC. La grammaire qu’elle donne est plus courte, l’algorithme plus précis, et elle tranche plusieurs questions que la RFC laissait explicitement ouvertes.

Comment l’utiliser

  1. Saisissez votre en-tête. Un par ligne si la réponse en envoie plusieurs. Une valeur séparée par des virgules et plusieurs en-têtes distincts sont normativement équivalents : les deux formes donnent ici la même réponse.
  2. Décrivez les cadres autour de la page. Donnez l’origine du document qui envoie l’en-tête, puis les origines qui l’encadrent, de la plus proche à la plus lointaine, jusqu’à l’onglet. Cela compte plus qu’il n’y paraît : la vérification remonte toute la chaîne.
  3. Ajoutez une Content-Security-Policy si vous en envoyez une. Si une politique appliquée comporte frame-ancestors, X-Frame-Options est ignoré entièrement. Cochez la case Report-Only pour voir la différence, plus grande que la plupart des gens ne l’imaginent.

Les cas qu’aucune table ne consigne

Le comportement intéressant apparaît lorsqu’une réponse porte plus d’une valeur, ce qui arrive couramment parce qu’un proxy ou un framework ajoute un en-tête que l’application avait déjà posé. La norme publie une table de réponses résolues pour précisément ces cas, et les résultats ne sont pas ceux qu’on devinerait. SAMEORIGIN à côté d’une valeur invalide bloque la page. Deux valeurs invalides l’autorisent. La règle est délibérée : un en-tête portant une valeur qui a un sens et une autre confuse ressemble à la mauvaise configuration de quelque chose qui tentait de fonctionner, il est donc bloqué à dessein, tandis qu’un en-tête entièrement illisible est traité comme s’il n’avait jamais été envoyé.

Une virgule finale suffit à le déclencher. Le découpage transforme SAMEORIGIN, en deux valeurs, la seconde vide, et cela compte comme une deuxième valeur distincte : la page est donc bloquée. Envoyer SAMEORIGIN dans un en-tête et un X-Frame-Options vide dans un autre produit le même effet, exactement pour la même raison.

ALLOWALL est le survivant le plus étrange. Il n’apparaît nulle part dans la RFC 7034 — il n’a jamais fait partie de la grammaire documentée de l’en-tête — et pourtant la norme le nomme, uniquement pour que la règle des valeurs multiples puisse l’attraper. Seul, il ne fait strictement rien, et une page n’envoyant qu’ALLOWALL est aussi intégrable qu’une page sans en-tête.

ALLOW-FROM est celui que l’on continue de copier depuis les tutoriels. Il figure dans la grammaire de la RFC, et la norme HTML dit en toutes lettres qu’il ne doit pas être implémenté. Une page qui s’y fie pour autoriser un partenaire précis autorise tout le monde, en silence, car une valeur que la grammaire n’admet pas est traitée comme une absence d’en-tête.

La question laissée ouverte par la RFC

SAMEORIGIN paraît sans ambiguïté et ne l’est pas. Imaginez une page encadrée par le widget d’un partenaire, ce widget étant lui-même encadré par votre propre site au niveau supérieur. L’origine comparée est-elle celle de la page qui encadre immédiatement, celle du document de premier niveau dans l’onglet, ou celle de tous les documents intermédiaires ? La RFC 7034 admet les trois lectures dans son propre texte, en notant que les critères peuvent ne pas être évalués de façon unanime et en énumérant chaque possibilité.

La norme HTML tranche : la vérification remonte toute la chaîne d’ancêtres, et un seul document d’une autre origine, où qu’il soit, bloque la page. L’exemple ci-dessus est donc refusé, même si la page de premier niveau est la vôtre. C’est la plus stricte des trois lectures, et c’est celle qu’implémente l’outil ci-dessus — d’où le fait que l’exemple par défaut semble devoir être autorisé et ne l’est pas.

L’autre règle à connaître est qu’une directive CSP frame-ancestors ne se contente pas d’avoir la priorité : elle retire X-Frame-Options de l’équation. L’algorithme cherche la directive avant même de regarder la valeur de l’en-tête, si bien qu’une page envoyant DENY aux côtés de n’importe quelle politique contenant frame-ancestors n’est régie que par la politique. Mais cela ne vaut que pour une politique appliquée. Un en-tête Content-Security-Policy-Report-Only est ignoré, car l’algorithme ne considère que les politiques dont la disposition est l’application — déplacer frame-ancestors en Report-Only le temps d’un test rend donc la main, sans le dire, à un en-tête auquel vous aviez peut-être cessé de penser.

Ce que cela ne peut pas vous dire

Cela vous dit ce qu’un navigateur conforme doit faire, pas ce que fait tel navigateur. La distinction est réelle : si la RFC admet une ambiguïté, c’est précisément parce que les implémentations divergeaient, et un navigateur peut traîner un comportement ancien pendant des années. Rien ici n’a été mesuré face à un navigateur réel, et l’annexe de compatibilité d’un document de 2013 ne prouve rien sur aujourd’hui.

Cela ne voit pas non plus la page dont vous parlez. C’est vous qui fournissez les origines : la réponse ne vaut donc que ce que vaut la chaîne décrite — et la chaîne est justement la partie facile à se tromper, puisqu’une page peut être encadrée par quelque chose que vous n’avez pas mis là. Pour la réponse réelle d’une page réelle, les outils de développement du navigateur vous diront quand un cadre a été refusé, et pourquoi.

Enfin, X-Frame-Options est la moitié la plus ancienne d’un couple. Tout ce qu’il exprime, une directive CSP frame-ancestors l’exprime aussi, et elle couvre en plus ce que l’en-tête ne sait pas faire : autoriser une origine précise, en autoriser plusieurs, ou comparer sur le schéma. L’en-tête reste utile pour les clients anciens, et les deux cohabitent très bien, mais un nouveau déploiement devrait s’appuyer sur la politique plutôt que sur l’en-tête.

Pourquoi est-ce gratuit ?

Exécuter l’algorithme d’une spécification, c’est de l’arithmétique sur quelques chaînes de caractères, et cela se passe dans votre navigateur. Aucun serveur n’intervient, il n’y a donc rien à facturer ni de compte à créer.

Rien n’est envoyé. L’en-tête et les origines que vous saisissez ne quittent pas l’onglet.