Comment empêcher IFRAME de rediriger la fenêtre de haut niveau

certains sites Web ont un code pour" casser "des enceintes IFRAME , ce qui signifie que si une page A est chargée comme un IFRAME à l'intérieur d'une page parent P un certain Javascript dans A redirige la fenêtre externe à A .

typiquement ce Javascript ressemble à quelque chose comme ceci:

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

ma question est: en tant qu'auteur de la page mère P et ne pas être l'auteur de la page intérieure A , Comment puis-je empêcher A de faire cette évasion?

P. S. Il me semble que cela devrait être un cross-site de violation de la sécurité, mais il ne l'est pas.

111
demandé sur Jason Cohen 2008-12-15 22:50:55

9 réponses

essayez d'utiliser la propriété onbeforeunload, qui permettra à l'utilisateur de choisir s'il veut naviguer loin de la page.

exemple: https://developer.mozilla.org/en-US/docs/Web/API/Window.onbeforeunload

dans HTML5 vous pouvez utiliser la propriété sandbox. Voir la réponse de Pankrat ci-dessous. http://www.html5rocks.com/en/tutorials/security/sandboxed-iframes /

37
répondu fasih.rana 2013-10-24 12:49:30

avec HTML5 l'attribut iframe sandbox a été ajouté. Au moment d'écrire ce fonctionne sur Chrome, Safari, Firefox et les versions récentes D'IE et Opera mais fait à peu près ce que vous voulez:

<iframe src="url" sandbox="allow-forms allow-scripts"></iframe>

si vous voulez autoriser les redirections de haut niveau spécifient sandbox="allow-top-navigation" .

116
répondu Pankrat 2013-06-12 12:31:35

j'utilise sandbox="..."

  • allow-formes permet de soumission de formulaire
  • autoriser les popups permet popups
  • allow-pointeur-lock permet pointeur de verrouillage
  • permet-même-origine permet au document de maintenir son origine
  • allow-scripts permet L'exécution JavaScript, et permet également des fonctionnalités pour déclencher automatiquement""
  • permet-top-navigation permet document pour sortir du cadre en naviguant dans la fenêtre de haut niveau

de navigation en Haut est ce que vous voulez éviter, laissez donc cela et il ne sera pas autorisé. Tout ce qui reste sera bloqué

ex.

        <iframe sandbox="allow-same-origin allow-scripts allow-popups allow-forms" src="http://www.example.com"</iframe>
36
répondu adigioia 2014-01-25 06:47:09

après la lecture du w3.org spec . J'ai trouvé la propriété du bac à sable.

vous pouvez définir sandbox="" , ce qui empêche l'iframe de rediriger. Cela dit, il ne redirigera pas l'iframe non plus. Vous perdrez le clic essentiellement.

exemple ici: http://jsfiddle.net/ppkzS/1/

Exemple sans bac à sable: http://jsfiddle.net/ppkzS /

7
répondu Parris 2013-08-06 06:36:08

je sais que cela fait longtemps que question n'a pas été faite mais voici ma version améliorée il attendra 500ms pour tout appel ultérieur seulement lorsque l'iframe est chargé.

<script type="text/javasript">
var prevent_bust = false ;
    var from_loading_204 = false;
    var frame_loading = false;
    var prevent_bust_timer = 0;
    var  primer = true;
    window.onbeforeunload = function(event) {
        prevent_bust = !from_loading_204 && frame_loading;
        if(from_loading_204)from_loading_204 = false;
        if(prevent_bust){
            prevent_bust_timer=500;
        }
    }
    function frameLoad(){
        if(!primer){
            from_loading_204 = true;
            window.top.location = '/?204';
            prevent_bust = false;
            frame_loading = true;
            prevent_bust_timer=1000;
        }else{
            primer = false;
        }
    }
    setInterval(function() {  
        if (prevent_bust_timer>0) {  
            if(prevent_bust){
                from_loading_204 = true;
                window.top.location = '/?204';
                prevent_bust = false;
            }else if(prevent_bust_timer == 1){
                frame_loading = false;
                prevent_bust = false;
                from_loading_204 = false;
                prevent_bust_timer == 0;
            }



        }
        prevent_bust_timer--;
        if(prevent_bust_timer==-100) {
            prevent_bust_timer = 0;
        }
    }, 1);
</script>

et onload="frameLoad()" et onreadystatechange="frameLoad();" doivent être ajoutés au cadre ou à l'iframe.

4
répondu Luis Deleon 2012-08-03 20:32:04

puisque la page que vous chargez à l'intérieur de l'iframe peut exécuter le code "break out" avec un setInterval, onbeforeunload pourrait ne pas être pratique, car il pourrait flud l'utilisateur avec " Êtes-vous sûr que vous voulez partir?' dialogue.

il y a aussi l'attribut de sécurité iframe qui ne fonctionne que sur IE & Opera

: (

2
répondu user47087 2009-01-22 12:30:01

dans mon cas, je veux que l'utilisateur visite la page intérieure pour que le serveur puisse voir son ip en tant que visiteur. Si j'utilise la technique de proxy php, je pense que la page intérieure verra mon ip de serveur comme un visiteur, donc ce n'est pas bon. La seule solution que j'ai trouvé jusqu'à présent est wilth onbeforeunload. Mettez ceci sur votre page:

<script type="text/javascript">
    window.onbeforeunload = function () {                       
         return "This will end your session";
    }
</script>

cela fonctionne à la fois dans firefox et ie, thats ce que j'ai testé pour. vous trouverez des versions utilisant quelque chose comme evt.rendre (n'importe quoi) Merde... cela ne fonctionne pas dans firefox.

2
répondu radu 2010-01-26 12:12:37

ce faisant, vous serez en mesure de contrôler toute action de la page encadrée, ce que vous ne pouvez pas. Même domaine de la politique de l'origine s'applique.

0
répondu Diodeus - James MacFarlane 2008-12-15 20:17:59