Предотвращение детского iframe от "выхода из кадра" - PullRequest
11 голосов
/ 15 апреля 2009

Я занимаюсь простой веб-интеграцией, которую выполняю с помощью iframe. В моем главном окне есть некоторый JavaScript, который взаимодействует с моим сервером, чтобы перенаправить iframe на нужный URL. К сожалению, на одной из целевых страниц есть следующий фрагмент кода:

if (top.location != location) {
    top.location.href = document.location.href ;
}

Скрипт умирает из-за ограничений межсайтового криптования и препятствует правильному отображению этой страницы Я не могу изменить источник этой страницы (сторонняя организация, с которой я интегрируюсь).

Как я мог обойти это?

Спасибо

Ответы [ 4 ]

23 голосов
/ 27 декабря 2013

Это мой первый пост, так что не трогайте меня, если он не работает, но это исправление работает для меня в IE. Добавьте безопасность = "ограничено" для вашего кадра.

пример:

<iframe id="frame_id" name="frame_name" security="restricted" src="page.html">  
</iframe>

Редактировать: я нашел лучшее решение. Это не блокирует скрипты и не требует JavaScript. Попробуйте использовать sandbox = "..."

  • 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>
12 голосов
/ 18 июня 2009

Существует метод отключения кода очистки кадра, , как обсуждалось в новом вопросе SO :

Как выясняется, ваш код перебора кадров может быть отключен , , как показано здесь :

<script type="text/javascript">
    var prevent_bust = 0  
    window.onbeforeunload = function() { prevent_bust++ }  
    setInterval(function() {  
      if (prevent_bust > 0) {  
        prevent_bust -= 2  
        window.top.location = 'http://server-which-responds-with-204.com'  
      }  
    }, 1)  
</script>

Этот код выполняет следующие действия:

  • увеличивает счетчик каждый раз, когда браузер пытается отойти от текущей страницы, с помощью обработчика событий window.onbeforeonload
  • устанавливает таймер, который срабатывает каждую миллисекунду с помощью setInterval(), и, если он видит счетчик с приращением, меняет текущее местоположение на сервер управления атакующего
  • этот сервер обслуживает страницу с кодом состояния HTTP 204 , что не приводит к перемещению браузера в любом месте
6 голосов
/ 06 ноября 2010

Действительный вопрос, и я бы хотел, чтобы больше людей восприняли его всерьез, а не просто отвечали на него неубедительными комментариями о «уважении» пожеланий тех, чей материал связан, иногда непреднамеренно.

А как насчет уважения к трафику, который перехватывает фрейм javascript?

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

Существует множество подлинных и невинных причин для использования фреймов или фреймов, и не только очень легко, но и невероятно часто код, особенно URL-адреса, вставляется законно или незаконно в страницу в этом фрейме. преднамеренно или иным образом приводит трафик к другой странице, которая довольно грубо нарушает набор фреймов и захватывает трафик.

Правильный подход сетевого этикета для веб-мастера, который не хочет, чтобы его материал отображался во фрейме, независимо от того, был ли он сделан намеренно или непреднамеренно, - это создать скрипт перенаправления на верхнюю страницу, которая отображает сообщение, информирующее серфера о том, что запрошенная страница не предназначена для просмотра в фреймах, и если они захотят просмотреть эту страницу, они могут просмотреть ее по URL-адресу, который затем будет связан, чтобы открыть его на новой вкладке или странице браузера. , который не нарушает фрейм-сет и не крадет трафик оригинальных сайтов, что позволяет серферу самостоятельно выбирать, где он на самом деле хочет путешествовать.

Хотелось бы, чтобы больше веб-мастеров уважали такой сетевой этикет.

5 голосов
/ 05 января 2012

После долгих поисков я разработал простой трюк. Я создал фиктивную страницу на своем собственном сайте, к чему призвал меня фрейм. Затем на фиктивной странице у меня был фрейм i, который призывал сайт вырваться из фреймов. Он вырвался из первого кадра, но поскольку фиктивная страница была на моем сайте, она аккуратно осталась в рамке верхней страницы. violla

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