Aller au contenu principal
Security Headers Scanner
L'observatoire des en-têtes de
sécurité de vos sites internet
Analyses totales 15210
Score moyen 38,70
Sites analysés 2013
Meilleur score 155

X-Frame-Options (XFO)

Empêcher ou limiter l’affichage d’une page web à l’intérieur d’un autre site.

Comprendre X-Frame-Options

Une page web peut être affichée à l’intérieur d’une autre page, notamment grâce à une <iframe>.

Ce fonctionnement peut être parfaitement légitime : il est par exemple utilisé pour intégrer une vidéo, une carte, un document, un graphique ou certains services externes.

X-Frame-Options permet au site d’indiquer au navigateur s’il autorise ou non sa page à être affichée dans ce type de cadre.

Pourquoi est-ce important ?

L’intégration d’une page peut aussi être détournée par un site malveillant.

Un attaquant peut par exemple afficher une page légitime dans une iframe, la rendre presque invisible ou la superposer à une fausse interface.

L’utilisateur pense alors cliquer sur un élément visible, alors que son clic atteint en réalité un bouton ou un lien présent dans la page cachée.

Cette technique est appelée clickjacking.

Exemple : l’utilisateur pense cliquer sur « Voir la vidéo », alors que le clic peut en réalité valider une action dans une page invisible placée en dessous.

X-Frame-Options permet donc de réduire le risque qu’une page soit utilisée à l’insu de l’utilisateur dans ce type d’attaque.

Configurer X-Frame-Options

Le serveur ajoute l’en-tête HTTP X-Frame-Options à sa réponse.

Le navigateur utilise ensuite cette valeur pour décider si la page peut être affichée dans une iframe ou un cadre similaire.

Les principales valeurs

DENY

Interdit complètement l’intégration de la page, y compris par une autre page appartenant au même site.

SAMEORIGIN

Autorise l’intégration uniquement lorsque la page qui effectue l’intégration appartient à la même origine.

Exemple avec DENY

X-Frame-Options: DENY

Cette configuration indique au navigateur que la page ne doit jamais être intégrée dans une iframe.

Elle convient particulièrement aux pages qui n’ont aucune raison d’être affichées dans une autre page, par exemple certaines interfaces d’administration, de compte utilisateur ou de gestion.

Exemple avec SAMEORIGIN

Une page située sur :

https://example.com/compte/

peut utiliser :

X-Frame-Options: SAMEORIGIN

Une autre page de la même origine peut alors éventuellement l’intégrer, tandis qu’un site externe comme https://autre-site.fr ne doit pas pouvoir le faire.

X-Frame-Options et Content-Security-Policy

X-Frame-Options est un mécanisme historique largement utilisé pour contrôler l’intégration d’une page.

Une Content-Security-Policy (CSP) peut également contrôler ce comportement grâce à la directive :

frame-ancestors

Cette directive offre davantage de précision lorsqu’il faut définir quelles origines sont autorisées à intégrer la page.

Interdire toute intégration avec CSP

Content-Security-Policy: frame-ancestors 'none';

Cette règle interdit l’intégration de la page dans un autre contexte.

Autoriser uniquement la même origine

Content-Security-Policy: frame-ancestors 'self';

CSP permet également d’autoriser des origines précises, ce que X-Frame-Options ne permet pas de faire aussi finement.

X-Frame-Options reste utile.
Pour une protection moderne, la directive frame-ancestors de CSP permet un contrôle plus précis. X-Frame-Options peut néanmoins être conservé comme protection complémentaire, avec une configuration cohérente entre les deux mécanismes.

Bonnes pratiques et limites

Bonnes pratiques

  • Protéger les pages qui n’ont aucune raison d’être intégrées dans un autre site.
  • Utiliser DENY lorsque toute intégration doit être interdite.
  • Utiliser SAMEORIGIN lorsqu’une intégration par la même origine est nécessaire.
  • Utiliser frame-ancestors dans CSP lorsqu’un contrôle plus précis est nécessaire.
  • Vérifier les pages réellement destinées à être intégrées, comme certains lecteurs, widgets, cartes ou documents.
  • Tester les fonctionnalités concernées après toute modification afin de vérifier que les intégrations légitimes continuent à fonctionner.

Toutes les pages n’ont pas besoin de la même règle

Une page de connexion, un espace utilisateur ou une interface d’administration n’a généralement aucune raison d’être affichée à l’intérieur d’un site externe.

À l’inverse, certains contenus sont volontairement conçus pour être intégrés ailleurs : lecteur vidéo, carte, graphique, document ou widget.

La politique doit donc correspondre au fonctionnement réellement attendu de chaque type de contenu.

Ce que X-Frame-Options ne remplace pas

X-Frame-Options protège principalement contre l’intégration non souhaitée d’une page.

Il ne contrôle pas :

  • les scripts qu’une page peut exécuter ;
  • les images ou autres ressources qu’elle peut charger ;
  • les connexions vers des services externes ;
  • la sécurité générale du code et de l’application.

Ces aspects doivent être protégés avec d’autres mécanismes, notamment une Content-Security-Policy (CSP) correctement configurée.

Les pages qui n’ont pas vocation à être intégrées ailleurs doivent donc disposer d’une protection contre le framing, grâce à X-Frame-Options, à CSP frame-ancestors, ou aux deux de manière cohérente.

À retenir : X-Frame-Options permet d’empêcher ou de limiter l’affichage d’une page à l’intérieur d’une autre page.
Cette protection contribue notamment à lutter contre le clickjacking, où une interface légitime est masquée ou superposée afin de tromper l’utilisateur sur l’action qu’il réalise réellement.