Запрет на iframe/frame или защита от кликджекинга

Кликджекинг(Clickjacking) - это механизм при котором ресурс жертвы отображается через iframe/frame, но при этом некоторые активные элементы перекрываются с помощью прозрачных html-тегов, содержащих обработчики нажатия JavaScript.

Запрет на iframe/frame или защита от кликджекинга

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

Один из самых известных способов защиты имеет название «framebusting». Он проверяет открытие страницы внутри iframe/frame с помощью JavaScript. Если адрес текущей страницы отличается от того, что написано в адресной строке браузера, выполняется перенаправление:

<script type="text/javascript">
     if(top != self) {
     top.location.href = '/index.html';}
</script>

Как оказалось позже, и этот способ можно обойти в большинстве современных браузеров:

<iframe sandbox src="http://xsef.ru/"></iframe>

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

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

Deny - полностью ограничит отображаение ресурса через iframe/frame.
Sameorigin - отображение ресурсов только инициируемых самим сайтом.

Реализация с помощью конфигурации сервера Apache/Nginx:

Header always append X-Frame-Options Deny
Header always append X-Frame-Options Sameorigin

Реализация в PHP:

header("X-Frame-Options: Deny");
header("X-Frame-Options: Sameorigin");

Вот таким несложным способам можно уберечь сайт от кликджекинга.