145 votes

Comment empêcher l'IFRAME de rediriger la fenêtre de niveau supérieur ?

Certains sites Web disposent d'un code permettant de "sortir" de l'application. IFRAME enclosures, ce qui signifie que si une page A est chargé comme un IFRAME à l'intérieur d'une page parent P du Javascript dans A redirige la fenêtre extérieure vers A .

Généralement, 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 la suivante : en tant qu'auteur de la page parentale P et ne pas être l'auteur de la page intérieure A comment puis-je éviter A de faire cette sortie ?

P.S. Il me semble que cela devrait être une violation de la sécurité intersites, mais ce n'est pas le cas.

133voto

Pankrat Points 2145

Avec HTML5, le bac à sable iframe a été ajouté. Au moment de la rédaction de 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 permettre les redirections de niveau supérieur spécifient sandbox="allow-top-navigation" .

60voto

adigioia Points 128

J'utilise sandbox="..."

  • allow-forms permet la soumission de formulaires
  • allow-popups autorise les popups
  • allow-pointer-lock permet le verrouillage du pointeur
  • allow-same-origin permet au document de conserver son origine.
  • allow-scripts permet l'exécution de JavaScript, et permet également aux fonctionnalités de se déclencher automatiquement
  • allow-top-navigation permet au document de sortir du cadre en naviguant dans la fenêtre de niveau supérieur.

La navigation en haut de page est ce que vous voulez empêcher, donc ne la mentionnez pas et elle ne sera pas autorisée. Tout ce qui n'est pas mentionné sera bloqué.

ex.

        <iframe sandbox="allow-same-origin allow-scripts allow-popups allow-forms" src="http://www.example.com"</iframe>

44voto

fasih.ahmed Points 863

Essayez d'utiliser la propriété onbeforeunload, qui laissera l'utilisateur choisir s'il veut quitter la page.

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

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

11voto

Parris Points 4366

Après avoir lu le w3.org spec . J'ai trouvé la propriété du bac à sable.

Vous pouvez définir sandbox="" ce qui empêche la redirection de l'iframe. Ceci étant dit, la redirection de la iframe ne se fera pas non plus. Vous perdrez essentiellement le clic.

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

4voto

Luis Deleon Points 41

Je sais que cela fait longtemps que la question n'a pas été posée, mais voici ma version améliorée : elle attendra 500 ms pour tout appel ultérieur, uniquement 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();" doit être ajouté au cadre ou à l'iframe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X