Cadre Buster Buster ... buster code nécessaire

Disons que vous ne voulez pas d'autres sites à "l'image" de votre site dans un <iframe>:

<iframe src="http://example.org"></iframe>

Si vous insérez anti-encadrement, cadre de contournement du code JavaScript dans vos pages:

/* break us out of any containing iframes */
if (top != self) { top.location.replace(self.location.href); }

Excellent! Maintenant, vous "buste" ou de sortir de tout contenant iframe automatiquement. Sauf pour un petit problème.

Comme il s'avère, votre cadre de contournement du code peut être éclaté, comme illustré ici:

<script type="text/javascript">
    var prevent_bust = 0  
    window.onbeforeunload = function() { prevent_bust++ }  
    setInterval(function() {  
      if (prevent_bust > 0) {  
        prevent_bust -= 2  
        window.top.location = 'http://example.org/page-which-responds-with-204'  
      }  
    }, 1)  
</script>

Ce code est le suivant:

  • incrémente un compteur à chaque fois que le navigateur tente de naviguer loin de la page en cours, via le window.onbeforeunload gestionnaire d'événement
  • met en place un timer qui déclenche à chaque milliseconde par setInterval(), et si elle voit le compteur incrémenté, les changements de la position actuelle à un serveur de l'attaquant contrôle
  • ce serveur sert une page avec le code d'état HTTP 204, qui ne provoque pas le navigateur pour naviguer n'importe où

Ma question est -- et ce n'est plus un JavaScript puzzle que d'une réelle problème - comment pouvez-vous vaincre le cadre de casse-buster?

J'ai eu quelques idées, mais rien n'a fonctionné lors de mes tests:

  • essayer de dégager le onbeforeunload événement via onbeforeunload = null a eu aucun effet
  • l'ajout d'un alert() arrêté le processus de laisser l'utilisateur de savoir ce qui se passait, mais ne pas interférer avec le code en aucune façon; en cliquant sur OK permet le contournement de continuer normalement
  • Je ne peux pas penser à une façon d'effacer le setInterval() minuterie

Je ne suis pas beaucoup de programmeurs JavaScript, voici donc mon défi pour vous: hey buster, pouvez-vous le buste le cadre de casse-buster?

Je ne suis pas sûr que le support-buster-buster fonctionne réellement...quand j'essaie de le tester (redirection vers un gestionnaire j'ai mis en place pour un retour 204), il m'empêche de naviguer n'importe où en dehors de la page--y compris la dactylographie de trucs dans la barre d'adresse! Je dois fermer l'onglet du navigateur et en ouvrir un nouveau pour obtenir n'importe où. Donc, en d'autres termes, je ne suis pas sûr que ce besoin d'une solution, parce que le frame-buster-buster vouloir être cassé est cassé...pour commencer. 🙂 (C'est ça ou j'ai foiré mon test, ce qui pourrait ne jamais arriver...) 😉
Matt, le bloc-buster-buster code affiché ci-dessus certainement fonctionne. Un.. euh.. ami.. de la mine.. dit moi .. à ce sujet. Ou quelque chose. 🙂
Jeff, êtes-vous tester avec windows sur le même domaine? On dirait que vous êtes, parce que si vous n'étiez pas à l'époque des restrictions de sécurité serait de vous empêcher de modifier 'onBeforeUnload'
Sur une note de côté: Lors de la publication des exemples, veuillez utiliser des domaines comme example.org comme spécifié dans la RFC 2606 ietf.org/rfc/rfc2606.txt
Concernant le thème général de la contre-contre-contre-mesures: galactanet.com/comic/view.php?strip=209

OriginalL'auteur Jeff Atwood | 2009-06-06