Как запретить IFRAME перенаправлять окно верхнего уровня - PullRequest
118 голосов
/ 15 декабря 2008

На некоторых веб-сайтах есть код для «взлома» 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 выполнить этот разрыв?

P.S. Мне кажется, что это должно быть нарушение безопасности между сайтами, но это не так.

Ответы [ 9 ]

118 голосов
/ 27 марта 2012

В HTML5 добавлен атрибут iframe sandbox . На момент написания этого работает на Chrome, Safari, Firefox и последних версиях IE и Opera , но делает в основном то, что вы хотите:

<iframe src="url" sandbox="allow-forms allow-scripts"></iframe>

Если вы хотите разрешить перенаправления верхнего уровня, укажите sandbox="allow-top-navigation".

40 голосов
/ 15 декабря 2008

Попробуйте использовать свойство onbeforeunload, которое позволит пользователю выбрать, хочет ли он уйти со страницы.

Пример: https://developer.mozilla.org/en-US/docs/Web/API/Window.onbeforeunload

В HTML5 вы можете использовать свойство песочницы. Пожалуйста, смотрите ответ Панкрата ниже. http://www.html5rocks.com/en/tutorials/security/sandboxed-iframes/

39 голосов
/ 25 января 2014

Я использую песочницу = "..."

  • allow-формы разрешают отправку формы
  • allow-popups разрешает всплывающие окна
  • allow-pointer-lock позволяет блокировать указатель
  • allow-same-origin позволяет документу сохранять свое происхождение
  • allow-scripts позволяет выполнять JavaScript, а также позволяет функциям запускаться автоматически
  • allow-top-navigation позволяет документу выходить за рамки, перемещаясь по окну верхнего уровня

Навигация сверху - это то, что вы хотите предотвратить, так что оставьте это, и это не будет разрешено. Все, что пропущено, будет заблокировано

ех.

        <iframe sandbox="allow-same-origin allow-scripts allow-popups allow-forms" src="http://www.example.com"</iframe>
7 голосов
/ 06 августа 2013

После прочтения спецификации w3.org . Я нашел свойство песочницы.

Вы можете установить sandbox="", что предотвращает перенаправление iframe. Это сказанное, это не перенаправит iframe также. Вы потеряете щелчок по существу.

Пример здесь: http://jsfiddle.net/ppkzS/1/
Пример без песочницы: http://jsfiddle.net/ppkzS/

4 голосов
/ 03 августа 2012

Я знаю, что прошло много времени с тех пор, как вопрос был решен, но вот моя улучшенная версия, она будет ждать 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();" должны быть добавлены к фрейму или фрейму.

2 голосов
/ 26 января 2010

В моем случае я хочу, чтобы пользователь посетил внутреннюю страницу, чтобы сервер видел свой ip в качестве посетителя. Если я использую технику php proxy, я думаю, что внутренняя страница увидит ip моего сервера в качестве посетителя, так что это не хорошо. Единственное решение, которое я получил, - это до загрузки. Разместите это на своей странице:

<script type="text/javascript">
    window.onbeforeunload = function () {                       
         return "This will end your session";
    }
</script>

Это работает как в Firefox, так и в том, что я проверял. вы найдете версии, использующие что-то вроде дерьма evt.return (что угодно) ... который не работает в Firefox.

2 голосов
/ 22 января 2009

Поскольку страница, которую вы загружаете внутри iframe, может выполнить код "разрыва" с помощью setInterval, onbeforeunload может оказаться не очень практичным, поскольку она может вызвать у пользователя "Вы уверены, что хотите покинуть?" Диалоги.

Существует также атрибут безопасности iframe, который работает только в IE & Opera

(

0 голосов
/ 15 декабря 2008

Таким образом вы сможете контролировать любое действие страницы в рамке, что вы не можете. Политика происхождения того же домена применяется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...