Blog. Just Blog

Запрет просмотра сайта во фрейме

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Web-мастеру и не только | Автор: ManHunter
Возвращаясь к теме защиты контента сайта, нужно упомянуть еще защиту от просмотра сайта во фрейме другого сайта. Кроме того, что никто не сможет таким способом использовать ваш контент, в какой-то мере это поможет защититься от DDoS-атак, когда на сайте с большой посещаемостью ставится скрытый iframe со ссылкой на атакуемый сайт. Посещая основной сайт, пользователи помимо своей воли открывают также и сайт-жертву, создавая огромную нагрузку на него. Такие инциденты уже неоднократно происходили. В этой статье я попытался собрать различные способы защиты сайтов от открытия во фрейме и различные способы их преодоления.

Первый способ защиты основан на скриптах JavaScript. Его суть сводится к тому, что проверяется соответствие top-окна открытой странице, если они не совпадают, значит страница открыта во фрейме. При обнаружении такой несправедливости браузер перенаправляется на другую страницу. Я использую вот такой вариант скрипта для "побега" из фрейма:
  1. // Frame-Killer #1
  2. if (top!=self) { top.location.href='/'; }
Есть еще один похожий вариант, который делает почти то же самое:
  1. // Frame-Killer #2
  2. if (top.location!=location) { top.location.href=location.href; }
И, наконец, скрипт, останавливающий загрузку страницы, если она открывается во фрейме. На мой взгляд, очень сомнительный способ.
  1. // Frame-Killer #3
  2. if (window.parent.frames.length>0) { 
  3.     // Mozilla, Opera, Chrome...
  4.     if (window.stop!=undefined) {
  5.         window.stop();
  6.     }
  7.     // для Internet Explorer
  8.     else if (document.execCommand!=undefined) {
  9.         document.execCommand("Stop"false);
  10.     }
  11. }
Все эти скрипты, понятное дело, должны находиться на защищаемом сайте. Долгое время все эти способы прекрасно работали, пока в HTML5 не появился специальный атрибут тега iframe - sandbox, который позволяет установить ограничения на контент, загружаемый во фрейме. Если этот атрибут имеет пустое значение, то на любой странице, которая открыта в этом фрейме, скрипты выполняться не будут. Соответственно, не выполнится и скрипт для "побега".
  1. <iframe src="http://your_site" sandbox=""></iframe>
"Песочница" поддерживается всеми современными браузерами (список браузеров и версии вы можете посмотреть здесь).

Для борьбы с "песочницей" я вижу только один вариант: часть контента сайта надо загружать динамически при помощи скриптов. Даже если страницу и удастся открыть во фрейме, запретив скрипты, то защищенная часть контента все равно будет недоступна.

Против первых двух скриптов, с помощью которых страница пытается "выпрыгнуть" из фрейма, поможет следующий скрипт, основанный на событии onbeforeunload, которое наступает, когда фрейм пытается подменить основную страницу.
  1. // Anti-frame-killer #1/#2
  2. window.onbeforeunload=function(e) {
  3.     window.onbeforeunload=null;
  4.     return 'Фрейм пытается сбежать!';
  5. }
Браузер выдаст предупреждение, достаточно отменить переход и все, родительская страница на месте и во фрейме открыта нужная страница. Скрипты на ней при этом нормально выполняются. Не забывайте только снимать обработчик onbeforeunload, когда фрейм будет полностью загружен, иначе это же сообщение появится при любом переходе со страницы.

Предупреждение об уходе со страницы
Предупреждение об уходе со страницы

Для противодействия трюку с onbeforeunload надо использовать скрипт "Frame-Killer #3" или же вызывать первые два с небольшим интервалом.
  1. // Проверять открытие во фрейме 10 раз в секунду
  2. setInterval(function() {  
  3.     // Тут располагается скрипт
  4.     // Frame-Killer #1 или Frame-Killer #2
  5. }, 100);
Рано или поздно пользователю наскучит диалог предупреждения, и, даже если защищенная страница откроется, нормально поработать с ней все равно не получится. А при использовании этого метода в браузерах Firefox и Chrome предупреждение об уходе вообще появилось только один раз, после чего страница спокойно "выпрыгнула" из фрейма.

На этом цепочку противостояния хитрой жопы и хера с винтом лучше остановить и перейти к защите на стороне сервера. Чтобы установить полный запрет загрузки вашего сайта во фреймах на других ресурсах, достаточно добавить в заголовки ответа сервера новый заголовок "X-Frame-Options". У заголовка может быть одно из трех значений:
  • SAMEORIGIN - Страница откроется во фрейме только в том случае, когда родительский документ расположен на том же домене. Оптимальный вариант для большинства сайтов.

  • DENY - Полный запрет открытия страницы во фрейме, независимо от домена.

  • ALLOW-FROM domain - Разрешает открывать страницу во фреймах указанного домена. Это значение поддерживается не всеми браузерами, поэтому его лучше не использовать.
Если в качестве веб-сервера используется Apache, то проще всего прописать этот заголовок в файл .htaccess

#<IfModule mod_headers.c>
Header always set X-Frame-Options SAMEORIGIN
#</IfModule>

В этом случае он будет автоматически добавлен ко всем запрашиваемым страницам и документам. Если требуется добавлять заголовок X-Frame-Options не ко всем страницам, или же контролировать открытие на основании домена, или у вас нет возможности отредактировать файл .htaccess, или веб-сервер его не поддерживает, то лучше всего передавать этот заголовок в движке самого сайта. Например, на PHP.
  1. Header('X-Frame-Options: SAMEORIGIN');
Также можно делать проверку на разрешенные домены, которая будет работать независимо от браузера клиента:
  1. // Разрешать просматривать во фрейме на своем сайте и на сайте my-domain.ru
  2. if (strpos(getenv('HTTP_REFERER'),'my-domain.ru')===false) {
  3.     Header('X-Frame-Options: SAMEORIGIN');
  4. }
Использование всех перечисленных методов защиты от просмотра сайта во фрейме позволит вам защититься от Clickjacking'а, от несанкционированного доступа к сайту через всякие анонимайзеры, а также от кражи контента.

Поделиться ссылкой ВКонтакте
Просмотров: 13289 | Комментариев: 18

Метки: JavaScript
Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
Dimas (19.04.2019 в 14:54):
А как здесь в код добавить 2 (еще один) домена?

// Разрешать просматривать во фрейме на своем сайте и на сайте my-domain.ru
if (strpos(getenv('HTTP_REFERER'),'my-domain.ru')===false) {
    Header('X-Frame-Options: SAMEORIGIN');
}
AlexBerg (05.04.2017 в 20:40):
Огромное спасибо за статью оказалась крайне полезной )) в качестве благодарности укажу ваш сайт в качестве парнеров на своих страничках. Реально сняли большой головняк спасибо еще раз
ManHunter (27.03.2017 в 11:04):
Какой смысл делать защиту, если потом рассказывать, как она работает?
Spectre (26.03.2017 в 20:55):
Здравствуйте!
Прошу поделиться информацией - как вы защитили сайт от анонимайзеров?
Например при попытке просмотра вашего сайта на noblockme.ru открывается поиск гугла.
Прошу научить
Олег (09.03.2017 в 13:09):
Спасибо! X-Frame-Options мгновенно решил проблему :)
ManHunter (03.10.2016 в 07:27):
Читай камменты, все написано.
Макс (03.10.2016 в 03:47):
через "set" тоже не работает
Макс (03.10.2016 в 03:32):
привет, обавил в .htaccess
<IfModule mod_headers.c>
Header always append X-Frame-Options SAMEORIGIN
</IfModule>
но сайт через анонимайзеры все равно открывается...
Аррис (01.11.2015 в 03:13):
Дельно, спасибо :)
ManHunter (25.10.2015 в 20:48):
Хорошо.
Neo (25.10.2015 в 20:37):
ну мир.. :)
___
Matrix has you!
ManHunter (23.10.2015 в 13:23):
Значит в браузере скрипты запрещены. У меня всё замечательно выпрыгивает.
brute (23.10.2015 в 13:04):
ну, не знаю:). Вроде, везде галочка "removed script" не стоит, всё равно всё работает:
http://free-web-server.date/in...ucnUv&hl=2ed
http://proxyfree.work/index.ph...ucnUv&hl=2ed
http://fastsurf.win/index.php?...ucnUv&hl=2ed
http://proxie.win/Loan.php?u=A...=5&f=norefer
http://ghostme.review/index.ph...ucnUv&hl=2ed
Но старые прокся работать перестали!! Прокси сайты живут всего пару месяцев, зато списки этих сайтов обновляются каждый день. Часто даже доменное имя им не делают. Так что, имхо, бороться с проксями и тяжело и бессмысленно.
ManHunter (23.10.2015 в 12:15):
Сделал тестовую страничку:
http://www.manhunter.ru/demo/frame.php
ManHunter (23.10.2015 в 11:57):
brute, и? X-Frame-Options не защищает от скачивания контента, а вырезание всех скриптов при скачивании страницы отключает любой frame-killer. Включи JS и попробуй повторить эксперимент.
За ссылки, кстати, спасибо. Добавил эти датацентры в черный список :)
ManHunter (23.10.2015 в 10:00):
www.manhunter.ru
brute (23.10.2015 в 09:46):
хотелось бы ссылку на тестовую страничку, которую нельзя открыть через анонимайзер:)

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2025
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.0039 сек.) / Память: 4.5 Mb
Наверх