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.
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.
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
DENYlorsque toute intégration doit être interdite. -
Utiliser
SAMEORIGINlorsqu’une intégration par la même origine est nécessaire. -
Utiliser
frame-ancestorsdans 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.