Sign in

Зарегистрируйтесь, чтобы стать полноправным участником сообщества Masterpro.ws.

Iframe и clickjacking. Вариации на тему

 

Iframe & clickjacking

Думаю, никто не откроет для себя великой истины в утверждении, что Глобальная Сеть таит множество опасностей, подстерегающих не только беспечных интернет-серфингистов, но, порой, и солидных вебмастеров-кодеров. Разберем сегодня, для начала, несколько способов защиты веб-сайта от iframe, а также атаки, получившей название clickjacking... господа студиозусы, прошу наконец тишины в аудитории, мы начинаем. Итак, по порядку. Все, надеюсь, и без нотиций старичка-профессора знают, что такое iframe?

 

 

Тег <iframe> создает плавающий фрейм, который находится внутри обычного документа, он позволяет загружать в область заданных размеров любые другие независимые документы; в том числе и контент сайта. Никогда не натыкались на куски вашего собственного сайта, разбросанные по вебу? - да, это вот именно оно. Не забывайте, что трафик, привлекаемый на сайт злоумышленника вашим контентом, обеспечивает вычислительными ресурсами именно ваш сервер.

Clickjacking — логическое продолжение описанного способа воровства контента и ресурсов; только в данном случае речь идет уже, скорее, о более опасном приложении сценария атаки - атакуемый сайт получает на сайте злоумышленника прозрачную обертку iframe, и пользователь, кликнув по хитроумно сформированной ссылке, на самом деле совершает в корне иное действие, нежели предполагал. Диапазон достигаемых таким образом целей довольно широк: от попыток манипулирования данными, накруток голосований и опросов - до разнообразных атак на отказ в обслуживании (Denial of Service).

Одним словом, приятного мало... рассмотрим сегодня варианты защиты. Ведь на всякий аргумент, как правило, можно найти контраргумент, не правда ли, господа-студенты? Его величество Яндекс, например, в целях защиты от iframe облюбовал для себя вот такой вот симпатичный скрипт:

 

<script>
if((self.parent&&!(self.parent===self))&&(self.parent.frames.length!=0)){self.parent.location=document.location}
</script>

 

Вы можете попробовать. Ручаюсь, вам не удастся опубликовать в iframe контент, <head> которого содержит этот скрипт... да-да, Петров, на порносайтах также нередко используются всякие-разные iframe. Ты думаешь, я не вижу, чем ты там занимаешься, на задней парте? - в мои школьные времена, кстати, она носила название "камчатка"... вот только ноутбуков тогда еще не было, увы. И, опять же увы, приведенный выше скрипт не отличается гибкостью: добавить домен-исключение:

 

<script>
if((self.parent&&!(self.parent===self))&&(self.parent.frames.length!=0)&&(window.location.hostname!='site.com')){self.parent.location=document.location}
</script>

 

- здесь, вероятнее всего, не удастся - элементарно не позволит политика безопасности браузера:

 

Uncaught SecurityError: Blocked a frame with origin "site1.com" from accessing a frame with origin "site2.com". Protocols, domains, and ports must match.
Refused to execute script from '********' because its MIME type ('application/json') is not executable, and strict MIME type checking is enabled.

 

Ну, что ж делать. Возможно, вам и не нужны домены-исключения? - в этом случае позволю себе порекомендовать следующие строчки, внесенные в .htaccess вашего сайта (пример взят из Bonus Custom Code от разработчиков отличного плагина безопасности для WordPress - BulletProof Security; CMS в данном случае значения не имеет):

 

<IfModule mod_headers.c>
# Using DENY will block all iFrames including iFrames on your own website
# Header set X-Frame-Options DENY
# Recommended: SAMEORIGIN - iFrames from the same site are allowed - other sites are blocked
# Block other sites from displaying your website in iFrames
# Protects against Clickjacking
Header always append X-Frame-Options SAMEORIGIN
# Protects against Drive-by Download attacks
# Protects against MIME/Content/Data sniffing
Header set X-Content-Type-Options nosniff
</IfModule>

 

И еще один несложный способ защиты, опять-таки посредством javascript:

 

<script type="text/javascript">
if (window.parent.frames.length > 0) {
window.stop();
}
</script>

 

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

 

<?php
$mystring = ($_SERVER["HTTP_REFERER"]);
$findme = 'vash_domen';
$pos = strpos($mystring, $findme);
if ($pos === false) {
?>
<script type="text/javascript">
window.stop();
</script>
<?
}
?>

 

Продолжение обсуждения темы об iframe и clickjacking на форуме

 

Да, этот перечень скриптов можно продолжать и далее, но... скажите, не утомил ли я вас сегодня рассказом об опасностях Глобальной Сети и способах их преодоления? Расслабьтесь: не так уж все и страшно, как кажется... двойка за семестр, поверьте, куда страшнее. Попрактикуйтесь дома на основе услышанного. Есть вопросы? ну, тогда успехов вам, коли вопросов нет; - успехов на просторах Глобальной Сети и не только. В следующий раз, пожалуйста, не опаздывайте, престарелый ваш профессор терпением не отличается... слышишь меня, Петров? - на порог не пущу, бестолочь, так и помрешь истощенным порносайтами мракобесом.

 

Оставить комментарий

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