Certains sites Web ont du code pour «sortir» des IFRAME
enclos, ce qui signifie que si une page A
est chargée en tant que IFRAME
page parente à l'intérieur d'une page parente, P
du Javascript A
redirige la fenêtre externe vers A
.
Typiquement, ce Javascript ressemble à 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 parente P
et n'étant pas l'auteur de la page intérieure A
, comment puis-je éviter A
de faire ce break-out?
PS Il me semble que cela devrait être une violation de sécurité intersite, mais ce n'est pas le cas.
javascript
html
iframe
Jason Cohen
la source
la source
Réponses:
Essayez d'utiliser la propriété onbeforeunload, qui permettra à l'utilisateur de choisir s'il souhaite 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 voir la réponse de Pankrat ci-dessous. http://www.html5rocks.com/en/tutorials/security/sandboxed-iframes/
la source
postMessage
. Ce n'est pas un risque pour la sécurité, mais quelqu'un voudra peut-être savoir que cette fonctionnalité existe lorsqu'il verra votre commentaire. :)sandbox
.Avec HTML5, l' attribut iframe sandbox a été ajouté. Au moment d'écrire ces lignes, cela fonctionne sur Chrome, Safari, Firefox et les versions récentes d'IE et d'Opera, mais fait à peu près ce que vous voulez:
Si vous souhaitez autoriser les redirections de niveau supérieur, spécifiez
sandbox="allow-top-navigation"
.la source
sandbox
n'autorise pas Flash ou tout autre type d'objet dans le cadre en bac à sable, ce qui rend lasandbox
fonctionnalité inutile dans de nombreux cas.J'utilise sandbox = "..."
La navigation par le haut est ce que vous voulez éviter, alors laissez-la de côté et elle ne sera pas autorisée. Tout ce qui est laissé de côté sera bloqué
ex.
la source
Après avoir lu la spécification w3.org . J'ai trouvé la propriété sandbox.
Vous pouvez définir
sandbox=""
, ce qui empêche l'iframe de rediriger. Cela étant dit, il ne redirigera pas non plus l'iframe. Vous perdrez le clic essentiellement.Exemple ici: http://jsfiddle.net/ppkzS/1/
Exemple sans sandbox: http://jsfiddle.net/ppkzS/
la source
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 sera chargé.
et
onload="frameLoad()"
etonreadystatechange="frameLoad();"
doivent être ajoutés au cadre ou à l'iframe.la source
J'ai trouvé quelques hacks utiles à ce sujet:
En utilisant JS, comment puis-je empêcher les iframes enfants de rediriger ou au moins inviter les utilisateurs à propos de la redirection
http://www.codinghorror.com/blog/2009/06/we-done-been-framed.html
http://coderrr.wordpress.com/2009/02/13/preventing-frame-busting-and-click-jacking-ui-redressing/
la source
Étant donné que la page que vous chargez à l'intérieur de l'iframe peut exécuter le code "break out" avec un setInterval, onbeforeunload peut ne pas être aussi pratique, car il pourrait flouter l'utilisateur avec "Êtes-vous sûr de vouloir partir?" dialogues.
Il existe également l'attribut de sécurité iframe qui ne fonctionne que sur IE et Opera
:(
la source
Dans mon cas, je souhaite que l'utilisateur visite la page interne afin que le serveur voie son adresse IP en tant que visiteur. Si j'utilise la technique du proxy php, je pense que la page interne verra mon IP de serveur en tant que visiteur, donc ce n'est pas bon. La seule solution que j'ai trouvée jusqu'à présent est wilth onbeforeunload. Mettez ceci sur votre page:
Cela fonctionne à la fois dans Firefox et c'est à dire, c'est ce que j'ai testé. vous trouverez des versions utilisant quelque chose comme evt.return (peu importe) merde ... qui ne fonctionne pas dans Firefox.
la source
Ce faisant, vous pourrez contrôler toute action de la page encadrée, ce que vous ne pouvez pas. La politique d'origine du même domaine s'applique.
la source