Как предотвратить загрузку страницы моего сайта через фрейм стороннего сайта iFrame


Как я могу узнать, что моя страница встроена в качестве рамки на другой сайт во время загрузки страницы? Я предполагаю, что заголовок запроса реферера не может мне здесь помочь? Спасибо.

Author: abovesun, 2010-05-24

6 answers

Вы не можете проверить это со стороны сервера, но вы можете использовать javascript, чтобы обнаружить это после загрузки страницы. Сравните top и self, если они не идентичны, вы находитесь в кадре.

Кроме того, некоторые современные браузеры уважают заголовок X-FRAME-OPTIONS, который может иметь два значения:

  • ЗАПРЕТИТЬ – запрещает отображение страницы, если она содержится во фрейме
  • ТО же самое, что и выше, если только страница не принадлежит к тому же домену, что и набор фреймов верхнего уровня держатель.

Пользователи включают Picasa от Google, которое нельзя встроить в рамку.

Браузеры, поддерживающие заголовок, с минимальной версией:

  • IE8 и IE9
  • Опера 10.50
  • Сафари 4
  • Хром 4.1.249.1042
  • Firefox 3.6.9 (более старые версии с NoScript)
 86
Author: Maerlyn, 2012-03-08 21:12:14

Stackoverflow включает в себя некоторые JS для его тестирования (master.js). Это соответствующая его часть:

if(top!=self){
    top.location.replace(document.location);
    alert("For security reasons, framing is not allowed; click OK to remove the frames.")
}

Но имейте в виду, что JS можно отключить.

 38
Author: Felix Kling, 2010-05-24 12:17:04

Для современных браузеров вы можете использовать CSP (Политику безопасности контента), которая является стандартом. Следующий заголовок предотвратит загрузку документа в рамку в любом месте:

Content-Security-Policy: frame-ancestors 'none'

(Хотя для IE 11 необходим префикс X-). Вы также можете изменить 'none' на источник, в котором разрешено создание фреймов, например, на вашем собственном сайте.

Чтобы охватить старые браузеры, это лучше всего использовать вместе с ответом @Maerlyn.

 20
Author: rvighne, 2017-05-23 12:26:05

Вы можете запретить загрузку страницы в iframe с помощью javascript

<script type="text/javascript">
if ( window.self !== window.top ) {
    window.top.location.href=window.location.href;
}
</script>

Этот код изменяет адрес контейнера iframe вашей страницы на адрес вашей страницы и заставляет контейнер показывать вашу страницу.

 13
Author: iman, 2013-12-10 11:28:53

Или вы можете заблокировать определенный домен, если вы не возражаете против вашего контента в некоторых местах, но не хотите, чтобы он размещался на определенном сайте. Например, если offendingdomain.com встраивал ваш контент, вы могли бы сделать это:

<script type="text/javascript">
    if(document.referrer.indexOf("offendingdomain.com") != -1) {
        window.location = "http://www.youtube.com/watch_popup?v=oHg5SJYRHA0";
    }
</script>

Это позволит проверить местоположение родительского документа и посмотреть, является ли offendingdomain.com тем, что встраивает ваш контент. Затем этот скрипт отправит этот iframe на определенное известное видео на YouTube в качестве наказания. По сути, они просто перевернулись сами.

 6
Author: earl3s, 2013-11-19 17:43:54

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

<script type="text/javascript">
if(top.location != window.location) {
    window.location = '/error_iframe.php';
}
</script>
 2
Author: jmslouie, 2010-05-24 13:49:14