Как предотвратить загрузку страницы моего сайта через фрейм стороннего сайта iFrame
Как я могу узнать, что моя страница встроена в качестве рамки на другой сайт во время загрузки страницы? Я предполагаю, что заголовок запроса реферера не может мне здесь помочь? Спасибо.
6 answers
Вы не можете проверить это со стороны сервера, но вы можете использовать javascript, чтобы обнаружить это после загрузки страницы. Сравните top
и self
, если они не идентичны, вы находитесь в кадре.
Кроме того, некоторые современные браузеры уважают заголовок X-FRAME-OPTIONS
, который может иметь два значения:
- ЗАПРЕТИТЬ – запрещает отображение страницы, если она содержится во фрейме
- ТО же самое, что и выше, если только страница не принадлежит к тому же домену, что и набор фреймов верхнего уровня держатель.
Пользователи включают Picasa от Google, которое нельзя встроить в рамку.
Браузеры, поддерживающие заголовок, с минимальной версией:
- IE8 и IE9
- Опера 10.50
- Сафари 4
- Хром 4.1.249.1042
- Firefox 3.6.9 (более старые версии с NoScript)
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 можно отключить.
Для современных браузеров вы можете использовать CSP (Политику безопасности контента), которая является стандартом. Следующий заголовок предотвратит загрузку документа в рамку в любом месте:
Content-Security-Policy: frame-ancestors 'none'
(Хотя для IE 11 необходим префикс X-
). Вы также можете изменить 'none'
на источник, в котором разрешено создание фреймов, например, на вашем собственном сайте.
Чтобы охватить старые браузеры, это лучше всего использовать вместе с ответом @Maerlyn.
Вы можете запретить загрузку страницы в iframe с помощью javascript
<script type="text/javascript">
if ( window.self !== window.top ) {
window.top.location.href=window.location.href;
}
</script>
Этот код изменяет адрес контейнера iframe вашей страницы на адрес вашей страницы и заставляет контейнер показывать вашу страницу.
Или вы можете заблокировать определенный домен, если вы не возражаете против вашего контента в некоторых местах, но не хотите, чтобы он размещался на определенном сайте. Например, если 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 в качестве наказания. По сути, они просто перевернулись сами.
Используйте javascript, чтобы проверить, был ли он загружен в iframe, поместив следующий скрипт в конец вашего php-файла и перенаправив на страницу, на которой отображается предупреждение или уведомление о том, что ваша страница не должна загружаться с помощью iframe.
<script type="text/javascript">
if(top.location != window.location) {
window.location = '/error_iframe.php';
}
</script>