Disons que vous ne voulez pas que d'autres sites "encadrent" votre site dans une page d'accueil. <iframe>
:
<iframe src="http://example.org"></iframe>
Vous insérez donc du JavaScript anti-cadrage dans toutes vos pages :
/* break us out of any containing iframes */
if (top != self) { top.location.replace(self.location.href); }
Excellent ! Désormais, vous sortez automatiquement des iframes qu'ils contiennent. Sauf pour un petit problème.
Il s'avère que.., votre code anti-cadres peut être cassé , comme indiqué 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 effectue les opérations suivantes :
- incrémente un compteur à chaque fois que le navigateur tente de naviguer hors de la page en cours, par l'intermédiaire de la fonction
window.onbeforeunload
gestionnaire d'événements - met en place une minuterie qui se déclenche toutes les millisecondes via
setInterval()
et s'il voit le compteur incrémenté, il change l'emplacement actuel pour un serveur contrôlé par l'attaquant - ce serveur envoie une page avec le code d'état HTTP 204 qui ne permet pas au navigateur de naviguer n'importe où
Ma question est la suivante - et il s'agit plus d'un puzzle JavaScript que d'une véritable problème -- Comment vaincre le destructeur de cadres ?
J'ai eu quelques idées, mais rien n'a fonctionné lors de mes tests :
- en essayant d'effacer le
onbeforeunload
événement viaonbeforeunload = null
n'a pas eu d'effet - l'ajout d'un
alert()
a arrêté le processus, ce qui a permis à l'utilisateur de savoir ce qui se passait, mais n'a pas interféré avec le code de quelque manière que ce soit ; en cliquant sur OK, le processus se poursuit normalement. - Je ne vois aucun moyen d'effacer la
setInterval()
minuterie
Je ne suis pas vraiment un programmeur JavaScript, alors voici le défi que je vous lance : hey buster, peux-tu casser le cadre buster ?
0 votes
Je n'ai pas les moyens de tester cela pour le moment, mais il semble que la seule façon de bloquer le minuteur très rapide de la page d'accueil soit de bloquer activement l'unique thread javascript du navigateur avec une boucle infinie. Ce que je ne sais pas, c'est si le navigateur sera capable de recharger la page du haut pendant que cela se passe. top.location.replace(self.location.href) ; while(true) { }
16 votes
Matt, le code "frame-buster-buster" posté ci-dessus définitivement œuvre. Un euh ami m'en a parlé Ou quelque chose comme ça :)
0 votes
... comme utiliser <body onbeforeunload="prevent_bust++"> au lieu de window.onbeforeunload ou quelque chose comme ça ;]
2 votes
Je réponds à cela top.document.body.onbeforeunload = null ; :)
10 votes
Jeff, testez-vous avec les deux Windows sur le même domaine ? Il semble que oui, car si ce n'était pas le cas, les restrictions de sécurité vous empêcheraient de modifier 'onBeforeUnload'
29 votes
Par ailleurs, lorsque vous publiez des exemples, veuillez utiliser des domaines tels que
example.org
comme spécifié dans la RFC 2606 ietf.org/rfc/rfc2606.txt1 votes
@Matt Winckler - Je suis d'accord. Le code de buster-buster semble très peu fiable. En testant sur Firefox 2 et 3, j'ai obtenu le même comportement que vous. Dans IE6,7,8, Safari 3, Opera 9.6, Chrome 2, il n'y a pas eu d'effet.
0 votes
@Steve Reed - while(true) ne fait que geler la page, mais en utilisant cette idée, l'ajout d'une courte pause fonctionne. Le temps que le code de l'intervalle accède au thread, il est trop tard, et la page contenue s'est échappée.
0 votes
Je viens de mettre à jour ma réponse, essayez-la.
2 votes
Juste par curiosité, pourquoi voulez-vous faire cela ? On dirait que cela a été inventé par les gens qui voulaient empêcher tout le monde de faire un clic droit sur leur page...
2 votes
youtube.com/watch?v=Iw3G80bplTg Pour ceux qui ne comprennent pas la référence. NSFW blasphème
0 votes
Si vous voulez tester votre buster buster buster, j'ai fait un page qui encadre un URL donné .
3 votes
En ce qui concerne le thème général des contre-mesures : galactanet.com/comic/view.php?strip=209
0 votes
Cet homme a une question à propos de votre frame buster : stackoverflow.com/questions/2298439/ . Jeff ou quelqu'un d'autre devrait aider cet homme.
0 votes
Jeff, le frame-buster-buster de stackoverflow ne fonctionne pas dans Chrome 10.0.634.0 dev sur Windows XP SP3. Après avoir cliqué sur "OK", la page est vide (toute blanche) et le src de l'iframe est indiqué comme suit stackoverflow.com . Les
src
de l'iframe est définie de manière dynamique.1 votes
@david nous ne supportons pas les navigateurs beta point.
1 votes
Psh, ce n'est pas une beta ! C'est de l'avant-garde ! haha. J'ai juste pensé que vous aimeriez le savoir car le frame-bustin` ne fonctionnera probablement plus dans quelques semaines/mois quand le canal stable aura rattrapé son retard.
2 votes
En rapport X-Frame-Options Mozilla spec prise en charge du navigateur pour éviter le détournement de clics, etc.
0 votes
Matt, pour ce que ça vaut, si vous utilisez JQuery, vous pouvez réactiver tous les liens sur votre page après avoir implémenté le framebuster-buster avec quelque chose comme
$("a").click(function() { prevent_bust--; });
au bas de la page1 votes
@MattWinckler, j'ai reproduit votre problème de ne pas pouvoir cliquer sur quoi que ce soit. Ce que j'ai fait, c'est d'effacer l'intervalle après le premier "onbeforeunload" pour qu'il se déclenche. Puisque la frame sera la toute première à déclencher cela, les événements suivants (comme le clic sur un lien) ne seront plus bloqués. Code :
var prevent_bust = 0 window.onbeforeunload = function() { prevent_bust++ } var interval = setInterval(function() { if (prevent_bust > 0) { prevent_bust -= 2; window.top.location = 'example.org/204.php'; clearInterval(interval); } }, 1);
2 votes
Quelques itérations plus tard, et nous verrons un cadre buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster bustier buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster buster
0 votes
Le code ci-dessus fonctionne-t-il aujourd'hui dans les navigateurs modernes ? Il ne semble pas fonctionner pour moi contre : <script>if(top != self) top.location.href = location.href;</script>En outre, où trouver un serveur qui renvoie 204 ?
0 votes
La CSP est la voie à suivre de nos jours, selon cette réponse : stackoverflow.com/a/31288040/339440 . Notez qu'un abuseur déterminé peut simplement extraire votre page et la reproduire lui-même à partir du back-end, il n'y a donc aucun moyen d'empêcher absolument quelqu'un de dupliquer votre contenu sur son site.
0 votes
Cet exemple de code de destruction d'image n'est pas déterministe, il dépend de qui a gagné la condition de course de onbeforeunload et setInterval, aussi parfois je ne peux pas taper/cliquer quoi que ce soit, cela peut être dû au fait que setInterval se réveille toutes les 1 ms.