Как предотвратить перенаправление окна верхнего уровня IFRAME
некоторые веб-сайты имеют код, чтобы "вырваться" из IFRAME вложения, что означает, что если страница A загружается как IFRAME внутри родительской страницы P некоторые Javascript в A перенаправляет внешнее окно на A.
обычно этот Javascript выглядит примерно так:
<script type="text/javascript">
if (top.location.href != self.location.href)
top.location.href = self.location.href;
</script>
мой вопрос: как автор родительской страницы P и не будучи автором внутренней страницы A, Как я могу предотвратить A от этого брейк-аут?
П. С. Мне кажется, что это должно быть кросс-сайте нарушение безопасности, но это не так.
9 ответов:
попробуйте использовать свойство onbeforeunload, которое позволит пользователю выбрать, хочет ли он перейти от страницы.
Пример:https://developer.mozilla.org/en-US/docs/Web/API/Window.onbeforeunload
в HTML5 можно использовать свойство sandbox. Пожалуйста, смотрите ответ Панкрата ниже. http://www.html5rocks.com/en/tutorials/security/sandboxed-iframes/
С HTML5 iframe sandbox. На момент написания этой работает на Chrome, Safari, Firefox и последних версиях IE и Opera но делает в значительной степени то, что вы хотите:
<iframe src="url" sandbox="allow-forms allow-scripts"></iframe>Если вы хотите разрешить перенаправления верхнего уровня укажите
sandbox="allow-top-navigation".
Я использую песочницу="..."
- разрешить-формы позволяет форму представления
- разрешить всплывающие окна позволяет всплывающие окна
- разрешить-указатель-блокировка позволяет указатель блокировки
- allow-same-origin позволяет документу сохранять свое происхождение
- разрешить-скрипты позволяют выполнение JavaScript, а также позволяет функции для автоматического запуска
- разрешить-верхняя навигация позволяет документу вырваться из кадра, Перейдя на верхний уровень окно
Верхняя навигация - это то, что вы хотите предотвратить, поэтому оставьте это, и это не будет разрешено. Все, что осталось, будет заблокировано
ex.
<iframe sandbox="allow-same-origin allow-scripts allow-popups allow-forms" src="http://www.example.com"</iframe>
после прочтения w3.org spec. Я нашел свойство песочницы.
вы можете установить
sandbox="", что предотвращает перенаправление iframe. Это, как говорится, он не будет перенаправлять iframe либо. Вы потеряете щелчок по существу.пример здесь:http://jsfiddle.net/ppkzS/1/
Пример без песочницы: http://jsfiddle.net/ppkzS/
Я знаю, что это было давно, так как вопрос был сделан, но вот моя улучшенная версия он будет ждать 500 мс для любого последующего вызова только при загрузке iframe.
<script type="text/javasript"> var prevent_bust = false ; var from_loading_204 = false; var frame_loading = false; var prevent_bust_timer = 0; var primer = true; window.onbeforeunload = function(event) { prevent_bust = !from_loading_204 && frame_loading; if(from_loading_204)from_loading_204 = false; if(prevent_bust){ prevent_bust_timer=500; } } function frameLoad(){ if(!primer){ from_loading_204 = true; window.top.location = '/?204'; prevent_bust = false; frame_loading = true; prevent_bust_timer=1000; }else{ primer = false; } } setInterval(function() { if (prevent_bust_timer>0) { if(prevent_bust){ from_loading_204 = true; window.top.location = '/?204'; prevent_bust = false; }else if(prevent_bust_timer == 1){ frame_loading = false; prevent_bust = false; from_loading_204 = false; prevent_bust_timer == 0; } } prevent_bust_timer--; if(prevent_bust_timer==-100) { prevent_bust_timer = 0; } }, 1); </script>и
onload="frameLoad()"иonreadystatechange="frameLoad();"должен быть добавлен в Frame или iframe.
Я нашел некоторые полезные хаки на этом:
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/
поскольку страница, которую вы загружаете внутри iframe, может выполнять код "break out" с помощью setInterval, onbeforeunload может быть не так практичен, поскольку он может сбить пользователя с " вы уверены, что хотите уйти?' диалоги.
существует также атрибут безопасности iframe, который работает только на IE & Opera
: (
в моем случае я хочу, чтобы пользователь посетил внутреннюю страницу, так что сервер будет видеть их ip в качестве посетителя. Если я использую метод прокси php, я думаю, что внутренняя страница увидит мой ip-адрес сервера в качестве посетителя, поэтому это не хорошо. Единственное решение, которое я получил до сих пор находится на onbeforeunload. Поместите это на свою страницу:
<script type="text/javascript"> window.onbeforeunload = function () { return "This will end your session"; } </script>это работает как в firefox, так и в ie, вот что я тестировал. вы найдете версии, использующие что-то вроде evt.верните (что угодно) дерьмо... это не работает внутри браузер firefox.
таким образом, вы сможете контролировать любое действие страницы в рамке, которое вы не можете. политика происхождения Того же домена применяется.
Comments