Як запобігти перенаправленню вікна верхнього рівня IFRAME


133

Деякі веб-сайти мають код, щоб "вирватися" з 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 Мені здається, що це повинно бути порушенням безпеки між сайтом, але це не так.


Я не думаю, що ти взагалі можеш багато зробити, якщо ти не автор вмісту кадру.
сканліфф

Відповіді:


43

Спробуйте скористатися властивістю onbeforeunload, яка дозволить користувачеві вибрати, чи хоче він переходити зі сторінки.

Приклад: https://developer.mozilla.org/en-US/docs/Web/API/Window.onbeforeunload

У HTML5 ви можете використовувати властивість пісочниці. Будь ласка, дивіться відповідь Панкрата нижче. http://www.html5rocks.com/en/tutorials/security/sandboxed-iframes/


1
плаваючі фрейми зробити дозволяють междоменной зв'язок, хоча, використовуючи postMessage. Це не є ризиком для безпеки, але хтось може потурбуватися про те, що ця можливість існує, коли вони побачать ваш коментар. :)
coreyward

На момент написання цієї відповіді це було неможливо. Дякую, що вказали на це.
fasih.rana

@SirDarius, будь ласка, покажіть приклад, дуже високо оцінений.
user198989

Користувач не дізнається, чому з'являється це підтвердження, і, ймовірно, вибере випадкову відповідь. Я не рекомендую його використовувати. Є й інші рішення sandbox.
oriadam

1
@ fasih.rana Друга стаття мені дуже допомогла. Дякую;)
MrD

127

З HTML5 додано атрибут пісочної рамки iframe . На момент написання роботи це працює на Chrome, Safari, Firefox та останніх версіях IE та Opera, але робить все, що ви хочете:

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

Якщо ви хочете дозволити переспрямування верхнього рівня, вкажіть sandbox="allow-top-navigation".


чекати, що? Вони дозволяють вам це робити? Я думав, що якщо веб-сайт хоче вийти з ладу, усі браузери дозволять це. Як люди повинні утримувати свій веб-сайт поза рамками цього тексту? Я не скаржуся, хоча, дивним.
Фаржер


1
@StephenSarcsamKamenar Якщо ви хочете захистити свій сайт від відображення в iframe, у наявності є заголовок X-Frame-Options зі значенням SAMEORIGIN . Більшість сучасних браузерів не відображатиме сайт у iframe із цим заголовком.
Гжегож

4
На жаль sandbox, не дозволяє Flash або будь-який інший тип об’єктів у пісочному кадрі, що робить цю sandboxфункцію марною у багатьох випадках.
oriadam

1
Веб-сайти не повинні "вибухнути", протестуючи проти включення в рамку. Вони можуть просто показати повідомлення або залишити порожнім. На жаль, дозвіл сценаріїв працювати в iframe все ще відкриває вас до шахрайського iframe, виконуючи час (1) {} та інші нескінченні цикли. Я хочу, щоб кожен кадр міг отримати власну нитку.
Григорій Магаршак

51

Я використовую пісочницю = "..."

  • enable-form дозволяє надсилати форму
  • enable-popups дозволяє спливаючі вікна
  • enable-pointer-lock дозволяє блокувати покажчик
  • enable-same-origin дозволяє документу зберігати своє походження
  • enable-script дозволяє виконувати виконання JavaScript, а також дозволяє автоматично запускати функції
  • Навігація-верх-навігація дозволяє документу вириватися з кадру, переходячи до вікна верхнього рівня

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

колишній

        <iframe sandbox="allow-same-origin allow-scripts allow-popups allow-forms" src="http://www.example.com"</iframe>

3
Зауважте, що Flash (та будь-які інші об'єкти) також будуть заблоковані, не маючи можливості його дозволити. Ця "функція безпеки" заважає мені спільно використовувати пісочницю
oriadam

8

Прочитавши специфікацію w3.org . Я знайшов властивість пісочниці.

Ви можете встановити sandbox="", що запобігає перенаправленню iframe. Це, як було сказано, також не перенаправить iframe. Ви практично втратите клацання.

Приклад тут: http://jsfiddle.net/ppkzS/1/
Приклад без пісочниці: http://jsfiddle.net/ppkzS/


4

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


3

2

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

Існує також атрибут захисту iframe, який працює лише в IE & Opera

:(


2

У моєму випадку я хочу, щоб користувач відвідував внутрішню сторінку, щоб сервер бачив їх ip як відвідувач. Якщо я використовую техніку php-проксі, я думаю, що внутрішня сторінка бачить ip-сервер мого відвідувача, тому це не добре. Єдине рішення, яке я отримав до цих пір, - це вільф передзавантаження. Розмістіть це на своїй сторінці:

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

Це працює як у firefox, так і в тому, що я тестував. ви знайдете версії, використовуючи щось на кшталт evt.return (будь-яке) лайно ... що не працює у firefox.


0

Роблячи це, ви зможете контролювати будь-яку дію сторінки з обрамленням, яку ви не можете. Застосовується політика щодо джерел того ж домену .


20
Я не прошу контролювати те, що знаходиться всередині IFRAME. Я прошу не допустити того, щоб те, що знаходиться всередині IFRAME, контролювало мене.
Джейсон Коен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.