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

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

Ответ 1

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

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

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

Пользователи включают Google Picasa, которые не могут быть встроены в фрейм.

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

  • IE8 и IE9
  • Opera 10.50
  • Safari 4
  • Chrome 4.1.249.1042
  • Firefox 3.6.9 (более старые версии с NoScript)

Ответ 2

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

Ответ 3

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

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

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

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

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

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

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