Запрет открытия сайта в iframe

Часто, для защиты сайта приходится запрещать его отображение в фреймах на других сайтах (чужих). Так это сделано, например, на Вконтакте и Facebook.

А делается это не сложно.

1. Отправка серверного заголовка, запрещающего браузеру показывать содержимое во фрейме

Если есть доступ к Апачу, то в файле httpd.conf просто добавляем строку:

Header always append X-Frame-Options SAMEORIGIN

Пояснение:
DENY — запрет отображения во всех фреймах;
SAMEORIGIN — отображать только во фреймах, инициируемых самим сайтом.

2. Также можно при помощи php:

<?php
header("X-Frame-Options: SAMEORIGIN");
?>

3. При помощи Javascript

Код позволит выявить, загружается ли ваш документ во фрейме, если да – то загрузка останавливается соответствующей командой. Вставить код надо в HEAD:

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

4. или вот такой способ с перенаправлением на ваш сайт:

<script type="text/javascript">
if(self != top) // если текущий документ не является верхним элементом
{
    top.location=document.location; // задаём верхнему элементу адрес нашей страницы
}
</script>

5. а вот так это сделано у яндекса

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

  • tekumze

    Скажите пожалуйста, как добавить домен-исключение в скрипт от Яндекса, скажем, либо в иной js ?

    • Roman NMSK

      скорее всего вот так 🙂
      if((self.parent&&!(self.parent===self))&&(self.parent.frames.length!=0)&&(window.location.hostname!=’site.com’)){self.parent.location=document.location}

      • tekumze

        Нет. Скрипт таким образом работает, но не работает домен-исключение. Попробовал вот так, в этом случае скрипт перестает работать совсем:

        if((self.parent&&!(self.parent===self))&&(self.parent.frames.length!=0)&&(self.parent.location.hostname != ‘site.com’)){self.parent.location=document.location}

  • Roman NMSK

    через ифрейм врядли удастся обойти, но по идее можно скачать к себе всю страницу и вырезать из исходника часть кода на проверку домена. но опять же — кусок кода может быть в каком-то из важных файлов и обфусцирован, а не внутри исходников страницы

  • Roman NMSK

    по коду особо не видно блокировки, но там используется плеер uppod. а на сколько я знаю — в самом плеере (в платной версии) есть защита от встраивания на сторонние сайты. скорее всего она у них включена

  • Roman NMSK

    а у тебя этот ифрейм подключен по всему сайту или на какой-то определенной странице? есть подозрение, что тебе могли перекрыть доступ по рефереру. т.е. с той стороны увидели многочисленные запросы от твоего сайта и где-то в конфиге добавили правило. по идее это можно проверить подключив твой код на каком-то другом домене

  • Roman NMSK

    искать решение — как скрыть передачу реферера (если по нему закрывали доступ) или же возможно закрыто по IP для сайта (тогда менять его). но это все временные меры и через какое-то время возможно снова закроют уже по другим параметрам