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

Заблокировать страницы в iframe, кроме текущего сайта

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

Для этого надо передавать заголовок X-Frame-Options со значением «SAMEORIGIN».

Рекомендуется делать через настройки веб-сервера, т.к. она будет применятся на всех страницах. Пример на Apache (.htaccess)

<IfModule headers_module>
Header set X-Frame-Options: "SAMEORIGIN"
</IfModule>

Или в PHP коде, но тогда надо будет указывать на каждой странице:

header('X-Frame-Options: SAMEORIGIN');

Также в качестве дополнительной защиты можно указать в JavaScript.

if (window.parent.frames.length > 0 && document.referrer.indexOf('sitename.ru') == -1) {
    window.stop();
}

Заблокировать открывать сайт в iframe

Чтобы запретить открывать сайт в любом iframe (включая текущий сайт), то надо передавать заголовок X-Frame-Options со значением «DENY».

Пример на Apache (.htaccess)

<IfModule headers_module>
Header set X-Frame-Options: "DENY"
</IfModule>

И в PHP коде:

header('X-Frame-Options: DENY');

Также в качестве дополнительной защиты можно указать в JavaScript.

if (window.parent.frames.length > 0) {
    window.stop();
}

Заблокировать страницы в iframe, кроме указанных сайтов

Указать список сайтов, которые могут выводить сайт в iframe можно через заголовок Content-Security-Policy.

Пример на Apache (.htaccess)

<IfModule headers_module>
Header set Content-Security-Policy "frame-ancestors 'self' https://sitename.ru https://know-online.com" 
</IfModule>

И на PHP

header("Content-Security-Policy: frame-ancestors 'self' https://sitename.ru https://know-online.com");

Раньше для этих целей в заголовке X-Frame-Options использовался параметр ALLOW-FROM, но сейчас это считается устаревшим.

Зачем закрывать доступ к сайту через iframe

Допустим есть финансовый сайт, где между пользователями можно переводить деньги.

Злоумышленник может на своём сайте вывести кнопку «нравится», и повесить поверх кнопки прозрачный iframe финансового сайта.

Когда пользователь попытается нажать на кнопку «нравится», то на самом деле он нажмёт на кнопку, расположенная в прозрачном iframe, которая может перевести все деньги с финансового сайта на аккаунт злоумышленника.

Если запретить выводить сайт через iframe, то данной возможности у злоумышленников не будет.

Данный вид атаки называется «кликджекинг» (анг. Click Jacking).