
Запрет просмотра сайта во фрейме
Возвращаясь к теме защиты контента сайта, нужно упомянуть еще защиту от просмотра сайта во фрейме другого сайта. Кроме того, что никто не сможет таким способом использовать ваш контент, в какой-то мере это поможет защититься от DDoS-атак, когда на сайте с большой посещаемостью ставится скрытый iframe со ссылкой на атакуемый сайт. Посещая основной сайт, пользователи помимо своей воли открывают также и сайт-жертву, создавая огромную нагрузку на него. Такие инциденты уже неоднократно происходили. В этой статье я попытался собрать различные способы защиты сайтов от открытия во фрейме и различные способы их преодоления.Первый способ защиты основан на скриптах JavaScript. Его суть сводится к тому, что проверяется соответствие top-окна открытой странице, если они не совпадают, значит страница открыта во фрейме. При обнаружении такой несправедливости браузер перенаправляется на другую страницу. Я использую вот такой вариант скрипта для "побега" из фрейма:
Code: Убрать нумерацию
- // Frame-Killer #1
- if (top!=self) { top.location.href='/'; }
Code: Убрать нумерацию
- // Frame-Killer #2
- if (top.location!=location) { top.location.href=location.href; }
Code: Убрать нумерацию
- // Frame-Killer #3
- if (window.parent.frames.length>0) {
- // Mozilla, Opera, Chrome...
- if (window.stop!=undefined) {
- window.stop();
- }
- // для Internet Explorer
- else if (document.execCommand!=undefined) {
- document.execCommand("Stop", false);
- }
- }
Code (HTML) : Убрать нумерацию
- <iframe src="http://your_site" sandbox=""></iframe>
Для борьбы с "песочницей" я вижу только один вариант: часть контента сайта надо загружать динамически при помощи скриптов. Даже если страницу и удастся открыть во фрейме, запретив скрипты, то защищенная часть контента все равно будет недоступна.
Против первых двух скриптов, с помощью которых страница пытается "выпрыгнуть" из фрейма, поможет следующий скрипт, основанный на событии onbeforeunload, которое наступает, когда фрейм пытается подменить основную страницу.
Code: Убрать нумерацию
- // Anti-frame-killer #1/#2
- window.onbeforeunload=function(e) {
- window.onbeforeunload=null;
- return 'Фрейм пытается сбежать!';
- }

Предупреждение об уходе со страницы
Для противодействия трюку с onbeforeunload надо использовать скрипт "Frame-Killer #3" или же вызывать первые два с небольшим интервалом.
Code (JavaScript) : Убрать нумерацию
- // Проверять открытие во фрейме 10 раз в секунду
- setInterval(function() {
- // Тут располагается скрипт
- // Frame-Killer #1 или Frame-Killer #2
- }, 100);
На этом цепочку противостояния хитрой жопы и хера с винтом лучше остановить и перейти к защите на стороне сервера. Чтобы установить полный запрет загрузки вашего сайта во фреймах на других ресурсах, достаточно добавить в заголовки ответа сервера новый заголовок "X-Frame-Options". У заголовка может быть одно из трех значений:
- SAMEORIGIN - Страница откроется во фрейме только в том случае, когда родительский документ расположен на том же домене. Оптимальный вариант для большинства сайтов.
- DENY - Полный запрет открытия страницы во фрейме, независимо от домена.
- ALLOW-FROM domain - Разрешает открывать страницу во фреймах указанного домена. Это значение поддерживается не всеми браузерами, поэтому его лучше не использовать.
#<IfModule mod_headers.c>
Header always set X-Frame-Options SAMEORIGIN
#</IfModule>
В этом случае он будет автоматически добавлен ко всем запрашиваемым страницам и документам. Если требуется добавлять заголовок X-Frame-Options не ко всем страницам, или же контролировать открытие на основании домена, или у вас нет возможности отредактировать файл .htaccess, или веб-сервер его не поддерживает, то лучше всего передавать этот заголовок в движке самого сайта. Например, на PHP.
Code (PHP) : Убрать нумерацию
- Header('X-Frame-Options: SAMEORIGIN');
Code (PHP) : Убрать нумерацию
- // Разрешать просматривать во фрейме на своем сайте и на сайте my-domain.ru
- if (strpos(getenv('HTTP_REFERER'),'my-domain.ru')===false) {
- Header('X-Frame-Options: SAMEORIGIN');
- }
Просмотров: 13289 | Комментариев: 18
Метки: JavaScript

Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье

AlexBerg
(05.04.2017 в 20:40):
Огромное спасибо за статью оказалась крайне полезной )) в качестве благодарности укажу ваш сайт в качестве парнеров на своих страничках. Реально сняли большой головняк спасибо еще раз

ManHunter
(27.03.2017 в 11:04):
Какой смысл делать защиту, если потом рассказывать, как она работает?

Spectre
(26.03.2017 в 20:55):
Здравствуйте!
Прошу поделиться информацией - как вы защитили сайт от анонимайзеров?
Например при попытке просмотра вашего сайта на noblockme.ru открывается поиск гугла.
Прошу научить
Прошу поделиться информацией - как вы защитили сайт от анонимайзеров?
Например при попытке просмотра вашего сайта на 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>
но сайт через анонимайзеры все равно открывается...
<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!
___
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
Но старые прокся работать перестали!! Прокси сайты живут всего пару месяцев, зато списки этих сайтов обновляются каждый день. Часто даже доменное имя им не делают. Так что, имхо, бороться с проксями и тяжело и бессмысленно.
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
http://www.manhunter.ru/demo/frame.php

ManHunter
(23.10.2015 в 11:57):
brute, и? X-Frame-Options не защищает от скачивания контента, а вырезание всех скриптов при скачивании страницы отключает любой frame-killer. Включи JS и попробуй повторить эксперимент.
За ссылки, кстати, спасибо. Добавил эти датацентры в черный список :)
За ссылки, кстати, спасибо. Добавил эти датацентры в черный список :)

brute
(23.10.2015 в 11:23):

ManHunter
(23.10.2015 в 10:00):
www.manhunter.ru

brute
(23.10.2015 в 09:46):
хотелось бы ссылку на тестовую страничку, которую нельзя открыть через анонимайзер:)

Добавить комментарий
Заполните форму для добавления комментария

// Разрешать просматривать во фрейме на своем сайте и на сайте my-domain.ru
if (strpos(getenv('HTTP_REFERER'),'my-domain.ru')===false) {
Header('X-Frame-Options: SAMEORIGIN');
}