Supposons que vous ne souhaitiez pas que d'autres sites "cadrent" votre site dans un <iframe>
:
<iframe src="http://example.org"></iframe>
Ainsi, vous insérez du JavaScript anti-cadrage et anti-trame dans toutes vos pages:
/* break us out of any containing iframes */
if (top != self) { top.location.replace(self.location.href); }
Excellent! Maintenant, vous "éclatez" ou sortez de tout iframe contenant automatiquement. Sauf pour un petit problème.
En fin de compte, votre code de suppression de trame peut être supprimé , 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 s'éloigner de la page actuelle, via le
window.onbeforeunload
gestionnaire d'événements - configure une minuterie qui se déclenche toutes les millisecondes via
setInterval()
, et s'il voit le compteur incrémenté, change l'emplacement actuel en serveur du contrôle de l'attaquant - ce serveur sert une page avec le code d'état HTTP 204 , ce qui ne fait pas naviguer le navigateur n'importe où
Ma question est - et il s'agit plus d'un puzzle JavaScript que d'un problème réel - comment pouvez-vous vaincre le briseur de casse-trame?
J'ai eu quelques réflexions, mais rien n'a fonctionné dans mes tests:
- tenter d'effacer l'
onbeforeunload
événement viaonbeforeunload = null
n'a eu aucun effet - l'ajout d'un
alert()
arrêt du processus a fait savoir à l'utilisateur que cela se passait, mais n'a pas interféré avec le code en aucune façon; cliquer sur OK permet à l'éclatement de continuer normalement - Je ne vois aucun moyen d'effacer le
setInterval()
chronomètre
Je ne suis pas beaucoup un programmeur JavaScript, alors voici mon défi pour vous: bon buster, pouvez-vous casser le buster casse-trame?
example.org
que spécifiés dans la RFC 2606 ietf.org/rfc/rfc2606.txt