Как запретить загрузку страницы моего сайта через сторонний фрейм сайта iFrame - PullRequest
68 голосов
/ 24 мая 2010

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

Ответы [ 6 ]

91 голосов
/ 24 мая 2010

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

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

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

В число пользователей входит Google Picasa, который нельзя встроить в рамку.

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

  • IE8 и IE9
  • Опера 10.50
  • Safari 4
  • Chrome 4.1.249.1042
  • Firefox 3.6.9 (более старые версии с NoScript )
39 голосов
/ 24 мая 2010

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 может быть отключен.

24 голосов
/ 18 августа 2014

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

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

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

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

13 голосов
/ 10 декабря 2013

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

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

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

6 голосов
/ 19 ноября 2013

Или вы можете заблокировать определенный домен, если вы не против своего контента в некоторых местах, но не хотите его на определенном сайте. Например, если 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 в качестве наказания. По сути, они просто Рик-Роллинг.

2 голосов
/ 24 мая 2010

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

<script type="text/javascript">
if(top.location != window.location) {
    window.location = '/error_iframe.php';
}
</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...