X-Frame-Options
===============

L'en-tête de réponse HTTP **`X-Frame-Options`** peut être utilisé afin d'indiquer si un navigateur devrait être autorisé à afficher une page au sein d'un élément `<frame>`, `<iframe>`, `<embed>` ou `<object>`. Les sites peuvent utiliser cet en-tête afin d'éviter les attaques de *clickjacking* (ou « détournement de clic ») pour s'assurer que leur contenu ne soit pas embarqué dans d'autres sites.

Ce complément de sécurité est uniquement valable lorsque l'utilisateur final visite le document avec un navigateur prenant en charge `X-Frame-Options`.

**Note :** L'en-tête `Content-Security-Policy` possède une directive `frame-ancestors` qui supplante cet en-tête pour les navigateurs compatibles.


|  |  |
| --- | --- |
| Type d'en-tête | En-tête de réponse |
| Nom d'en-tête interdit | Non |

Syntaxe
-------

Il existe deux directives pour `X-Frame-Options` :
```

X-Frame-Options: DENY
X-Frame-Options: SAMEORIGIN
```

### Directives

Si on utilise `DENY`, le chargement de la page dans une *frame* échouera sur un site tiers mais aussi sur un site de la même origine. En revanche, si on utilise `SAMEORIGIN`, on peut toujours utiliser le document dans une *frame* si celle-ci partage la même origine.

`DENY`

La page ne peut pas être affichée dans une *frame*, quand bien même un site tiers tenterait de la charger.

`SAMEORIGIN`

La page ne peut être affichée que dans une *frame* avec une origine qui est la même que la page elle-même. La spécification laisse le choix au navigateur de décider si cela s'applique au niveau le plus haut, au conteneur parent ou à l'ensemble de la chaîne des *frames* potentiellement imbriquées. Il est parfois avancé que cette option n'est pas très utile à moins que l'ensemble des ancêtres partage la même origine (cf. bug 725490). Voir aussi le tableau de compatibilité ci-après pour plus de détails sur la prise en charge de cette directive.

`ALLOW-FROM uri` 
Obsolète

Une directive obsolète qui ne fonctionne plus dans les navigateurs récents et qui ne doit donc plus être utilisée. Pour les navigateurs historiques, cette directive permettait d'indiquer une origine via une URI afin d'autoriser l'affichage du document dans les *frames* chargées depuis cette origine. Pour les anciennes versions de Firefox, on a le même problème qu'avec `SAMEORIGIN` : il n'y a pas de vérifications des différents ancêtres pour voir s'ils partagent la même origine. À la place, on utilisera la directive `frame-ancestors` de l'en-tête `Content-Security-Policy`.

Exemples
--------

**Note :** La balise `<meta>` est inutile ici ! `<meta http-equiv="X-Frame-Options" content="deny">` n'aura aucun effet et mieux vaut donc ne pas l'utiliser. L'en-tête `X-FRAME-OPTIONS` ne fonctionne que si vous l'utilisez dans la configuration HTTP comme dans les exemples ci-dessous.

### Configurer Apache

On peut configurer Apache afin d'envoyer l'en-tête `X-Frame-Options` pour toutes les pages. Dans la configuration, on ajoutera :
```

Header always set X-Frame-Options "SAMEORIGIN"
```


Si on veut utiliser la valeur `DENY`, on pourra utiliser ceci dans la configuration :
```

Header set X-Frame-Options "DENY"
```

### Configurer nginx

Avec nginx, on pourra ajouter la ligne suivante à la configuration HTTP, serveur ou à la configuration de l'emplacement (*location*) :
```

add_header X-Frame-Options SAMEORIGIN always;
```

### Configurer IIS

Pour IIS, ajoutez ce qui suit au fichier `Web.config` de votre site :


```xml
<system.webServer>
  ...

  <httpProtocol>
    <customHeaders>
      <add name="X-Frame-Options" value="SAMEORIGIN" />
    </customHeaders>
  </httpProtocol>

  ...
</system.webServer>
```


Consultez cet article Microsoft pour configurer IIS via l'interface du gestionnaire IIS (*IIS manager*).

### Configurer HAProxy

Pour HAProxy, on ajoutera la ligne suivante à la configuration du *frontend*, du *listen* ou du *backend* :
```

rspadd X-Frame-Options:\ SAMEORIGIN
```


Dans les versions plus récentes, voici la forme équivalente :
```

http-response set-header X-Frame-Options SAMEORIGIN
```

### Configurer Express

Si on utilise Express, on pourra utiliser le module helmet qui tire parti de frameguard afin de régler l'en-tête `X-Frame-Options`. Ajoutez ceci à la configuration serveur :


```js
const helmet = require("helmet");
const app = express();
app.use(helmet.frameguard({ action: "SAMEORIGIN" }));
```


On pourra également utiliser frameguard directement :


```js
const frameguard = require("frameguard");
app.use(frameguard({ action: "SAMEORIGIN" }));
```

Spécifications
--------------

| Specification |
| --- |
| HTML Standard # the-x-frame-options-header |

Compatibilité des navigateurs
-----------------------------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

Voir aussi
----------

* `frame-ancestors` lié à la configuration de la stratégie CSP via `Content-Security-Policy`
* L'en-tête HTTP `X-Frame-Options` - RFC 7034 (en anglais)
* Protéger contre le détournement de clic - IEBlog (en anglais)
* Lutter contre le détournement de clic avec l'en-tête `X-Frame-Options` - IEInternals (en anglais)