На некоторых веб-сайтах есть код для «выхода» из 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
этот разрыв?
PS Мне кажется, это должно быть нарушение межсайтовой безопасности, но это не так.
javascript
html
iframe
Джейсон Коэн
источник
источник
Ответы:
Попробуйте использовать свойство onbeforeunload, которое позволит пользователю выбрать, хочет ли он уйти со страницы.
Пример: https://developer.mozilla.org/en-US/docs/Web/API/Window.onbeforeunload
В HTML5 вы можете использовать свойство песочницы. См. Ответ Панкрата ниже. http://www.html5rocks.com/en/tutorials/security/sandboxed-iframes/
источник
postMessage
. Это не угроза безопасности, но кому-то может быть интересно узнать, что эта возможность существует, когда они увидят ваш комментарий. :)sandbox
.В HTML5 был добавлен атрибут песочницы iframe . На момент написания это работает в Chrome, Safari, Firefox и последних версиях IE и Opera, но делает в значительной степени то, что вы хотите:
Если вы хотите разрешить перенаправление верхнего уровня, укажите
sandbox="allow-top-navigation"
.источник
sandbox
, не позволяет Flash или любой другой тип объекта в изолированном фрейме, что делает этуsandbox
функцию во многих случаях бесполезной.Я использую sandbox = "..."
Верхняя навигация - это то, что вы хотите предотвратить, так что оставьте это, и это будет запрещено. Все, что не указано, будет заблокировано
ех.
источник
После прочтения спецификации w3.org . Я нашел свойство песочницы.
Вы можете установить
sandbox=""
, что предотвращает перенаправление iframe. При этом он также не будет перенаправлять iframe. Вы потеряете щелчок по существу.Пример здесь: http://jsfiddle.net/ppkzS/1/
Пример без песочницы: http://jsfiddle.net/ppkzS/
источник
Я знаю, что вопрос был задан давно, но вот моя улучшенная версия, она будет ждать 500 мс для любого последующего вызова только тогда, когда загружен iframe.
и
onload="frameLoad()"
иonreadystatechange="frameLoad();"
должны быть добавлены к раме или фрейма.источник
Я нашел несколько полезных советов по этому поводу:
Используя JS, как я могу остановить перенаправление дочерних фреймов 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, может выполнять код «разрыва» с помощью setInterval, onbeforeunload может оказаться не таким практичным, поскольку он может запутать пользователя вопросом «Вы уверены, что хотите уйти?» Диалоги.
Также есть атрибут безопасности iframe, который работает только в IE и Opera.
:(
источник
В моем случае я хочу, чтобы пользователь посетил внутреннюю страницу, чтобы сервер видел их IP-адрес как посетителя. Если я использую технику прокси-сервера php, я думаю, что внутренняя страница будет видеть мой IP-адрес сервера как посетителя, поэтому это не очень хорошо. Единственное решение, которое я получил до сих пор, - это Wilth onbeforeunload. Поместите это на свою страницу:
Это работает как в firefox, так и в том, что я тестировал. вы найдете версии, использующие что-то вроде evt.return (что угодно) дерьмо ... которое не работает в firefox.
источник
Таким образом вы сможете контролировать любое действие на странице во фрейме, чего вы не можете. Применяется политика происхождения одного домена .
источник