Как предотвратить перенаправление окна верхнего уровня 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 от этого брейк-аут?



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

664   9  

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.

поскольку страница, которую вы загружаете внутри 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

    Ничего не найдено.