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?
la source
example.org
que spécifiés dans la RFC 2606 ietf.org/rfc/rfc2606.txtRéponses:
Je ne sais pas si cela est viable ou non - mais si vous ne pouvez pas casser le cadre, pourquoi ne pas simplement afficher un avertissement. Par exemple, si votre page n'est pas la «première page», créez une méthode setInterval qui essaie de casser le cadre. Si après 3 ou 4 essais, votre page n'est toujours pas la première page - créez un élément div qui couvre toute la page (boîte modale) avec un message et un lien comme ...
Pas le meilleur, mais je ne vois pas comment ils pourraient en sortir.
la source
document.write("");
(après avoir établi qu'elle est en train d'être encadréeFWIW, la plupart des navigateurs actuels prennent en charge la directive X-Frame-Options: deny , qui fonctionne même lorsque le script est désactivé.
IE8:
http://blogs.msdn.com/ie/archive/2009/01/27/ie8-security-part-vii-clickjacking-defenses.aspx
Firefox (3.6.9)
https://bugzilla.mozilla.org/show_bug.cgi?id=475530
https://developer.mozilla.org/en/The_X-FRAME-OPTIONS_response_header
Chrome / Webkit
http://blog.chromium.org/2010/01/security-in-depth-new-security-features.html
http://trac.webkit.org/changeset/42333
la source
Nous avons utilisé l'approche suivante dans l'un de nos sites Web à partir de http://seclab.stanford.edu/websec/framebusting/framebust.pdf
la source
Entré avec cela, et cela semble fonctionner au moins dans Firefox et le navigateur Opera.
la source
onbeforeunload
gestionnaires, pas seulement celui du dessus!Compte tenu de la norme HTML5 actuelle qui a introduit le bac à sable pour iframe, tous les codes de contournement de cadre fournis dans cette page peuvent être désactivés lorsque l'attaquant utilise le bac à sable car cela empêche l'iframe de suivre:
Veuillez consulter: http://www.whatwg.org/specs/web-apps/current-work/multipage/the-iframe-element.html#attr-iframe-sandbox
Maintenant, considérez que l'attaquant a utilisé le code suivant pour héberger votre site dans iframe:
Ensuite, tout le code de contournement des cadres JavaScript échouera.
Après avoir vérifié tous les codes de bus de trame, seule cette défense fonctionne dans tous les cas:
celle initialement proposée par Gustav Rydstedt, Elie Bursztein, Dan Boneh et Collin Jackson (2010)
la source
Après avoir réfléchi pendant un petit moment, je pense que cela leur montrera qui est le patron ...
L'utilisation
_top
comme paramètre cible pourwindow.open()
le lancera dans la même fenêtre.la source
la source
Je vais être courageux et jeter mon chapeau dans le ring sur celui-ci (aussi ancien soit-il), voir combien de votes négatifs je peux collecter.
Voici ma tentative, qui semble fonctionner partout où je l'ai testé (Chrome20, IE8 et FF14):
J'ai placé ce code dans le
<head>
et l'ai appelé depuis la fin du<body>
pour s'assurer que ma page est affichée avant qu'elle ne commence à se disputer avec le code malveillant, je ne sais pas si c'est la meilleure approche, YMMV.Comment ça marche?
... Je vous entends demander - eh bien la réponse honnête est, je ne sais pas vraiment . Il a fallu beaucoup d'efforts pour le faire fonctionner partout où je testais, et l'effet exact qu'il a varie légèrement selon l'endroit où vous l'exécutez.
Voici la pensée derrière cela:
Pour mon
http://mysite.tld/page-that-takes-a-while-to-load
(la cible du XHR), j'ai utilisé un script PHP qui ressemble à ceci:Ce qui se produit?
Ne pouvez-vous pas éviter le temps d'attente dans Chrome et Firefox?
Apparemment non. Au début, j'ai pointé le XHR vers une URL qui retournerait un 404 - cela ne fonctionnait pas dans Firefox. Ensuite, j'ai essayé l'
sleep(5);
approche sur laquelle j'ai finalement atterri pour cette réponse, puis j'ai commencé à jouer avec la durée du sommeil de différentes manières. Je n'ai pas pu trouver de véritable modèle de comportement, mais j'ai trouvé que s'il était trop court, spécifiquement Firefox ne jouerait pas la balle (Chrome et IE semblent se comporter assez bien). Je ne sais pas quelle est la définition de "trop court" en termes réels, mais 5 secondes semblent fonctionner à chaque fois.Si des ninjas Javascript qui passent veulent expliquer un peu mieux ce qui se passe, pourquoi c'est (probablement) faux, peu fiable, le pire code qu'ils aient jamais vu, etc.
la source
À partir de 2015, vous devez utiliser la
frame-ancestors
directive CSP2 pour cela. Ceci est implémenté via un en-tête de réponse HTTP.par exemple
Bien sûr, peu de navigateurs prennent en charge CSP2, il est donc judicieux d'inclure l'ancien en-
X-Frame-Options
tête:Je conseillerais d'inclure les deux de toute façon, sinon votre site continuerait d'être vulnérable aux attaques de détournement de clics dans les anciens navigateurs, et bien sûr, vous obtiendriez un cadrage indésirable même sans intention malveillante. La plupart des navigateurs se mettent à jour automatiquement ces jours-ci, mais vous avez toujours tendance à bloquer les utilisateurs d'entreprise sur les anciennes versions d'Internet Explorer pour des raisons de compatibilité des applications héritées.
la source
Ok, donc nous savons que c'était dans un cadre. Nous avons donc location.href vers une autre page spéciale avec le chemin comme variable GET. Nous expliquons maintenant à l'utilisateur ce qui se passe et fournissons un lien avec une option target = "_ TOP". C'est simple et fonctionnerait probablement (je ne l'ai pas testé), mais cela nécessite une certaine interaction de l'utilisateur. Peut-être pourriez-vous signaler le site incriminé à l'utilisateur et faire une honte de cliquetis à votre site quelque part .. Juste une idée, mais ça marche la nuit ..
la source
Toutes les solutions proposées forcent directement un changement d'emplacement de la fenêtre supérieure. Et si un utilisateur souhaite que le cadre soit là? Par exemple, le cadre supérieur dans les résultats d'image des moteurs de recherche.
J'ai écrit un prototype où par défaut toutes les entrées (liens, formulaires et éléments d'entrée) sont désactivées et / ou ne font rien lorsqu'elles sont activées.
Si un cadre contenant est détecté, les entrées restent désactivées et un message d'avertissement s'affiche en haut de la page. Le message d'avertissement contient un lien qui ouvrira une version sûre de la page dans une nouvelle fenêtre. Cela empêche la page d'être utilisée pour le détournement de clics, tout en permettant à l'utilisateur d'afficher le contenu dans d'autres situations.
Si aucune trame contenant n'est détectée, les entrées sont activées.
Voici le code. Vous devez définir les attributs HTML standard sur des valeurs sûres et ajouter des attributs supplémentaires qui contiennent les valeurs réelles. Il est probablement incomplet et pour une sécurité totale, des attributs supplémentaires (je pense aux gestionnaires d'événements) devront probablement être traités de la même manière:
la source
Eh bien, vous pouvez modifier la valeur du compteur, mais c'est évidemment une solution fragile. Vous pouvez charger votre contenu via AJAX après avoir déterminé que le site n'est pas dans un cadre - ce n'est pas non plus une excellente solution, mais cela évite, espérons-le, de déclencher l'événement on beforeunload (je suppose).
Edit: Une autre idée. Si vous détectez que vous êtes dans un cadre, demandez à l'utilisateur de désactiver javascript, avant de cliquer sur un lien qui vous mène à l'URL souhaitée (en passant une chaîne de requête qui informe votre page pour dire à l'utilisateur qu'il peut réactiver javascript une fois qu'il a sont là).
Edit 2: Go Nuclear - si vous détectez que vous êtes dans un cadre, supprimez simplement le contenu du corps de votre document et imprimez un message désagréable.
Edit 3: pouvez-vous énumérer le document supérieur et définir toutes les fonctions sur null (même les anonymes)?
la source
<body>
intérieur d'une<plaintext>
balise surdisplay: none
. C'est assez efficace.Si vous ajoutez une alerte juste après le code buster, l'alerte bloquera le fil javascript et laissera la page se charger. C'est ce que fait StackOverflow, et il sort de mes iframes, même lorsque j'utilise le buster de suppression de trame. Cela a également fonctionné avec ma page de test simple. Cela n'a été testé que dans Firefox 3.5 et IE7 sur Windows.
Code:
la source
Je pense que tu y étais presque. As-tu essayé:
Ou bien:
Remarque: je n'ai pas réellement testé cela.
la source
Que diriez-vous d'appeler le buster à plusieurs reprises également? Cela créera une condition de course, mais on peut espérer que le buster arrive en tête:
la source
Si vous regardez les valeurs renvoyées par
setInterval()
ce sont généralement des chiffres simples, vous pouvez donc généralement désactiver toutes ces interruptions avec une seule ligne de code:la source
J'aurais peut-être juste trouvé un moyen de casser le javascript de buster frame. En utilisant getElementsByName dans ma fonction javascript, j'ai défini une boucle entre le buster de trame et le script de buster de bus de trame réel. consultez ce post. http://www.phcityonweb.com/frame-buster-buster-buster-2426
la source
setInterval et setTimeout créent un intervalle d'incrémentation automatique. Chaque fois que setTimeout ou setInterval est appelé, ce nombre augmente d'un, de sorte que si vous appelez setTimeout, vous obtiendrez la valeur actuelle la plus élevée.
Puisqu'il est presque inconnu qu'il y ait 10000 setIntervals et setTimeouts fonctionnant simultanément, et puisque setTimeout retourne "le dernier intervalle ou le timeout créé + 1", et puisque top.clearInterval est toujours accessible, cela vaincra les attaques de black-hat sur le frame les sites Web décrits ci-dessus.
la source
Utilisez htaccess pour éviter le jeu de cadres à forte prise, l'iframe et tout contenu comme les images.
Cela affichera une page de copyright au lieu de celle attendue.
la source
<meta name="referrer" …/>
et b) également défini lorsque vous cliquez sur des liens, de sorte que vous interdisez également les liens vers votre page et sautez la toile.