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.

Vérification d’intégration d’IFrame

:

Chaque ligne est traitée via la même vérification d’en‑têtes et ajoutée à l’historique de session ci‑dessous. Limite de 20 URLs par lot, vérifiées quelques‑unes à la fois pour respecter les sites cibles.

Vérifiés: /
URL Résultat HTTP

Aperçu en direct

L’analyse des en‑têtes permet un premier tri rapide, mais ne capte pas les mécanismes JavaScript de blocage (« frame‑busting ») : si les en‑têtes indiquent « Intégrable » alors que l’aperçu reste vide, brise le cadre ou affiche une erreur, la page ne peut pas être intégrée en toute sécurité. L’aperçu en direct constitue le verdict final.

Historique (cette session)

Sauvegardé uniquement dans cet onglet (sessionStorage) ; effacé à la fermeture de l’onglet. Aucune donnée n’est envoyée au serveur.

Aucune vérification effectuée durant cette session.

Fonctionnement de la vérification

  1. 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.
  2. 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).
  3. 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.

Questions fréquentes

Pourquoi une page indiquée comme « Intégrable » apparaît-elle vide dans l'aperçu ?
Les en-têtes de réponse autorisent le cadrage, mais la page peut contenir un script JS anti-cadrage, nécessiter une connexion ou des cookies, ou servir un contenu différent selon le visiteur. Fiez-vous à l'aperçu.
Est-il possible de contourner X-Frame-Options ou CSP ?
Non. Ces en-têtes sont strictement appliqués par le navigateur pour des raisons de sécurité (anti-clickjacking) ; les contournements côté client sont peu fiables. Pour intégrer un contenu dont vous n'avez pas la maîtrise, demandez au propriétaire du site d'ajouter votre origine à la liste blanche dans frame-ancestors, ou utilisez une solution d'intégration/API officielle fournie par celui-ci.
Quelle est la différence entre DENY et SAMEORIGIN ?
DENY bloque toute intégration dans un iframe, même depuis des pages de même origine. SAMEORIGIN n'autorise le cadrage que depuis des pages partageant le même schéma, hôte et port.
Cet outil conserve-t-il mes URL ?
L'historique est stocké uniquement dans l'onglet de votre navigateur via sessionStorage et disparaît à sa fermeture. Le serveur de vérification ne consulte que l'URL soumise afin d'en extraire les en-têtes de réponse.
Pourquoi une même URL retourne-t-elle des résultats différents à des moments différents ?
Certains sites envoient des en-têtes différents selon le chemin, après redirection, en fonction de l'agent utilisateur, ou encore selon des tests A/B ou les règles de leur WAF. Relancez le test pour consulter la configuration actuelle.