Vérificateur d'iframe
Outil gratuit en ligne pour tester l’intégration d’iframes : saisissez l’URL d’une page afin d’inspecter ses en‑têtes X‑Frame‑Options et Content‑Security‑Policy frame‑ancestors, déterminer si elle peut être encadrée, et vérifier le résultat avec un aperçu en direct. L’historique est sauvegardé uniquement pour la session de navigation en cours.
Historique (cette session)
Sauvegardé uniquement dans cet onglet (sessionStorage) ; effacé à la fermeture de l’onglet. Aucune donnée n’est envoyée au serveur.
Fonctionnement de la vérification
- Saisissez l’URL cible et cliquez sur Vérifier. Le serveur récupère la page comme une véritable requête iframe (avec Sec‑Fetch‑Dest: iframe) et lit ses en‑têtes de réponse.
- Le verdict est établi à partir des en‑têtes X‑Frame‑Options (DENY / SAMEORIGIN bloquent le cadrage) et Content‑Security‑Policy frame‑ancestors (seul * ou un joker de protocole autorise des parents tiers arbitraires).
- La même URL est chargée dans l’iframe d’aperçu en direct afin que vous puissiez confirmer le comportement réel du navigateur, y compris les scripts anti‑cadre que les en‑têtes ne révèlent pas.
Quels critères déterminent l’intégrabilité d’une page ?
La possibilité d'afficher une page web dans un `<iframe>` sur un autre site est déterminée par le navigateur, selon les en-têtes de réponse renvoyés par la page elle-même. Cet analyseur effectue le même contrôle côté serveur et vous fournit un verdict instantané.
`X-Frame-Options` est l'en-tête historique : `DENY` interdit toute intégration, `SAMEORIGIN` n'autorise que les pages issues de la même origine, tandis que `ALLOW-FROM` a été retiré des navigateurs modernes. En l'absence de cet en-tête, aucune règle héritée ne vient bloquer l'intégration.
`frame-ancestors` de `Content-Security-Policy` en est le successeur moderne. Il répertorie les origines autorisées à incorporer la page — par exemple `frame-ancestors 'self' https://example.com`. La valeur `*` (ou simplement un protocole tel que `https:`) autorise tout contexte parent en HTTPS ; toute restriction supplémentaire bloque l'intégration par des sites tiers.
Les en-têtes ne constituent toutefois pas l'intégralité du mécanisme : des scripts intégrés à la page peuvent exécuter du code de blocage d'iframe (comparaison `top !== self` forçant une navigation de premier plan), et certaines pages (comme les écrans de connexion ou les points d'accès soumis à des restrictions géographiques) peuvent réagir différemment aux requêtes provenant de centres de données. C'est pourquoi chaque analyse est systématiquement accompagnée d'un aperçu en temps réel.
Guide rapide : configuration des en‑têtes de réponse
Si vous gérez le site, contrôlez directement l'intégration via les en-têtes de réponse.
Bloquer l'intégration depuis n'importe quelle page
X-Frame-Options: DENY
Content-Security-Policy: frame-ancestors 'none'
Les navigateurs refusent d'afficher la page dans un iframe — la protection anti-clickjacking la plus stricte.
Autoriser uniquement l'intégration depuis une même origine
X-Frame-Options: SAMEORIGIN
Content-Security-Policy: frame-ancestors 'self'
Seules les pages partageant le même protocole, hôte et port peuvent l'intégrer ; les sites tiers sont bloqués.
N'autoriser que des origines spécifiques
Content-Security-Policy: frame-ancestors 'self' https://trusted.example.com
Ajoutez vos origines de confiance à `frame-ancestors` ; celles qui n'y figurent pas seront bloquées.
Autoriser l'intégration depuis n'importe quel site
Ne pas définir X-Frame-Options
Content-Security-Policy: frame-ancestors *
Tout site peut intégrer cette page dans un iframe. Évaluez les implications en matière de sécurité.
Remarque : X-Frame-Options est rendu obsolète par CSP `frame-ancestors`. Lorsque les deux sont définis, c'est CSP qui prime — privilégiez `frame-ancestors`.
Comment le serveur détecte-t-il qu’une requête provient d’une iframe ?
Depuis environ 2020, les navigateurs Chromium et Firefox ajoutent automatiquement une série d'en-têtes `Fetch-Metadata` à chaque navigation et chargement de sous-ressource. L'en-tête le plus pertinent pour contrôler l'intégration est `Sec-Fetch-Dest` : il informe le serveur du contexte à partir duquel la ressource est sollicitée, sans qu'aucune action ne soit requise de la part de la page appelante.
- `Sec-Fetch-Dest: document` : navigation principale (hors de tout cadre).
- `Sec-Fetch-Dest: iframe` : requête chargée à l'intérieur d'un élément `<iframe>`.
- `Sec-Fetch-Dest: frame` : chargement dans un ancien cadre HTML (`<frame>` / frameset).
- `Sec-Fetch-Dest: embed / object` : chargement à l'intérieur d'un élément `<embed>` ou `<object>`.
Cet outil envoie sa propre sonde avec l'en-tête `Sec-Fetch-Dest: iframe`, reproduisant strictement le trafic d'un véritable navigateur lors de l'intégration d'une page — le verdict reflète donc la réponse réelle du serveur cible face à des requêtes iframe légitimes, et non une simple requête HTTP standard.
L'en-tête `Sec-Fetch-Dest` est un indicateur utile, mais il ne constitue pas une limite de sécurité : il n'est envoyé que par les navigateurs modernes. Les clients autres que des navigateurs (cURL, robots, certaines webview et navigateurs hérités) peuvent omettre cet en-tête ou transmettre une valeur arbitraire. Un serveur peut l'utiliser pour journaliser ou limiter le taux de requêtes, mais ne doit jamais s'y appuyer seul pour décider si l'intégration en iframe est sécurisée. Cette décision incombe exclusivement à `X-Frame-Options` et `CSP frame-ancestors`, que les navigateurs imposent indépendamment des en-têtes envoyés.
Côté client, une page peut également détecter qu'elle est chargée dans un cadre, sans recourir à aucun en-tête, par exemple en comparant `window.top !== window.self` (ou en inspectant `window.frameElement` pour les cadres de même origine), puis agir en conséquence — afficher un avertissement ou forcer une redirection vers la fenêtre principale. Il s'agit de la technique de frame-busting évoquée précédemment, qui fonctionne indifféremment des en-têtes HTTP transmis.
Exemples de config serveur : bloquer l’intégration d’iframes
Les extraits suivants indiquent comment configurer votre serveur ou framework afin de bloquer intégralement l'intégration dans un iframe (X-Frame-Options: DENY + CSP `frame-ancestors` 'none'). Il s'agit de l'option la plus stricte parmi celles présentées dans le guide rapide ci-dessus.
server {
location / {
add_header X-Frame-Options "DENY" always;
add_header Content-Security-Policy "frame-ancestors 'none'" always;
}
}
<IfModule mod_headers.c>
Header always set X-Frame-Options "DENY"
Header always set Content-Security-Policy "frame-ancestors 'none'"
</IfModule>
app.use((req, res, next) => {
res.setHeader('X-Frame-Options', 'DENY');
res.setHeader('Content-Security-Policy', "frame-ancestors 'none'");
next();
});
// next.config.js
module.exports = {
async headers() {
return [
{
source: '/:path*',
headers: [
{ key: 'X-Frame-Options', value: 'DENY' },
{ key: 'Content-Security-Policy', value: "frame-ancestors 'none'" },
],
},
];
},
};
class SetFrameOptions
{
public function handle(Request $request, Closure $next): Response
{
$response = $next($request);
$response->headers->set('X-Frame-Options', 'DENY');
$response->headers->set('Content-Security-Policy', "frame-ancestors 'none'");
return $response;
}
}
export default {
async fetch(request) {
const response = await fetch(request);
const headers = new Headers(response.headers);
headers.set('X-Frame-Options', 'DENY');
headers.set('Content-Security-Policy', "frame-ancestors 'none'");
return new Response(response.body, { status: response.status, headers });
},
};
Vous souhaitez simplement autoriser votre propre site ou une courte liste blanche à intégrer cette page, plutôt que de bloquer tout le monde ? Remplacez `DENY` par `SAMEORIGIN`, et `'none'` par `'self'` ou une liste explicite d'origines. Le reste de la configuration demeure inchangé.
Points de vigilance connus sur certaines plateformes
Mise à part les règles générales concernant les en-têtes, certaines plateformes majeures présentent leurs propres spécificités. Il est pertinent de les connaître avant de conclure à un blocage ou à une intégrabilité potentielle sur la seule base des en-têtes HTTP.
| Plateforme / scénario | Comportement | Explication |
|---|---|---|
| Page de visionnage YouTube (youtube.com/watch) | Bloqué | Utilisez plutôt l'URL officielle du lecteur youtube.com/embed/{id} — la page de visionnage classique applique une politique de cadrage restrictive. |
| Page d'un lieu Google Maps | Bloqué | Seule l'URL iframe de l'API Maps Embed (google.com/maps/embed) est conçue pour être intégrée dans un cadre. |
| Pages de connexion OAuth Google / Microsoft | Bloqué | Cela a été bloqué volontairement depuis 2015 afin d'empêcher le vol d'identifiants via les iframe ; le processus de connexion doit obligatoirement s'exécuter dans une fenêtre principale ou une pop-up. |
| Pages de paiement / de commande (Stripe Checkout, PayPal, la plupart des passerelles bancaires) | Bloqué | Intégrer un formulaire de paiement dans un cadre constitue un vecteur classique de clickjacking ; les processeurs refusent donc systématiquement ce type de configuration. |
| Pages de dépôts ou de fichiers GitHub | Bloqué | Politique `frame-ancestors 'none'` appliquée à tout le site ; privilégiez l'API REST/GraphQL ou une capture d'écran plutôt qu'une iframe. |
| Pages « Publier sur le Web » Notion / Google Docs | Intégrable | Explicitement conçues pour être intégrées, et le produit fournit directement un code d'intégration prêt à l'emploi. |
| Articles Wikipedia | Intégrable | Absence par défaut de restrictions via `X-Frame-Options` ou CSP, mais vérifiez bien les conditions de licence et d'attribution avant une intégration à grande échelle. |
Cas d’usage courants
- Déterminer si un widget, un tableau de bord ou un document tiers peut être intégré à votre propre produit avant d'écrire le code d'intégration.
- Vérifier que votre site diffuse bien la stratégie `X-Frame-Options` ou `CSP frame-ancestors` que vous aviez définie.
- Diagnostiquer la protection anti-clickjacking : comprenez pourquoi une page affiche about:blank ou un message de refus dans un iframe.
- Tester en lot des URL candidates lors de l'agrégation de contenus ou de l'intégration à un portail ; utilisez l'historique de session pour consulter les résultats ultérieurement.
- Préparez vos revues de sécurité ou tests d'intrusion en documentant la politique de cadrage des dépendances externes.