web-dev-qa-db-fra.com

Comment empêcher le chargement de ma page de site via le cadre de site tiers d'iFrame

Comment puis-je savoir que ma page est intégrée en tant que cadre à un autre site lors du chargement de la page? Je suppose que l'en-tête de la demande de référence ne peut pas m'aider ici? Merci.

72
abovesun

Vous ne pouvez pas le vérifier du côté du serveur, mais vous pouvez utiliser javascript pour le détecter une fois la page chargée. Comparez top et self, s'ils ne sont pas identiques, vous êtes dans un cadre.

De plus, certains navigateurs modernes respectent le X-FRAME-OPTIONS en-tête, qui peut avoir deux valeurs:

  • REFUSER - empêche le rendu de la page si elle est contenue dans un cadre
  • SAMEORIGIN - comme ci-dessus, sauf si la page appartient au même domaine que le détenteur du jeu de cadres de niveau supérieur.

Les utilisateurs incluent Picasa de Google, qui ne peut pas être intégré dans un cadre.

Navigateurs qui prennent en charge l'en-tête, avec la version minimale:

  • IE8 et IE9
  • Opera 10.50
  • Safari 4
  • Chrome 4.1.249.1042
  • Firefox 3.6.9 (anciennes versions avec NoScript )
92
Maerlyn

Stackoverflow inclut du JS pour le tester (master.js). C'est la partie pertinente de celui-ci:

if(top!=self){
    top.location.replace(document.location);
    alert("For security reasons, framing is not allowed; click OK to remove the frames.")
}

Mais gardez à l'esprit que JS peut être désactivé.

40
Felix Kling

Pour navigateurs modernes , vous pouvez utiliser CSP (Content Security Policy), qui est une norme. L'en-tête suivant empêchera le document de se charger n'importe où dans un cadre:

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

(IE 11 a besoin du X- préfixe, cependant). Vous pouvez également modifier 'none' à l'origine sur laquelle le cadrage est autorisé, comme votre propre site.

Pour couvrir les anciens navigateurs, il est préférable de l'utiliser avec @ réponse de Maerlyn .

25
rvighne

vous pouvez empêcher le chargement de votre page dans un iframe avec javascript

<script type="text/javascript">
if ( window.self !== window.top ) {
    window.top.location.href=window.location.href;
}
</script>

ce code change l'adresse du conteneur de l'iframe de votre page en votre adresse de page et force le conteneur à afficher votre page.

14
iman

Ou vous pouvez bloquer un domaine spécifique si cela ne vous dérange pas votre contenu dans certains endroits mais ne le voulez pas sur un certain site. Par exemple, si offendingdomain.com intégrait votre contenu, vous pouvez le faire:

<script type="text/javascript">
    if(document.referrer.indexOf("offendingdomain.com") != -1) {
        window.location = "http://www.youtube.com/watch_popup?v=oHg5SJYRHA0";
    }
</script>

Cela vérifierait l'emplacement du document parent et verrait s'il s'agit du offendingdomain.com qui incorpore votre contenu. Ce script enverra ensuite cette iframe à une certaine vidéo YouTube célèbre comme punition. En fait, ils se sont juste roulés.

6
earl3s

Utilisez javascript pour vérifier s'il a été chargé sur iframe en plaçant le script suivant à la fin de votre fichier php et redirigez-le vers une page qui affiche un avertissement ou remarquez que votre page ne doit pas être chargée à l'aide d'iframe.

<script type="text/javascript">
if(top.location != window.location) {
    window.location = '/error_iframe.php';
}
</script>
2
jmslouie