Фреймкиллер
Фреймкиллер и (или фреймбастер или фреймбрейкер ) — это метод, используемый веб-сайтами веб -приложениями для предотвращения их веб-страниц отображения внутри фрейма . Фрейм — это подразделение окна веб-браузера, которое может действовать как окно меньшего размера. Убийца фреймов обычно используется для предотвращения загрузки веб-сайта из набора фреймов без разрешения или в качестве атаки, как в случае с кликджекингом .
Скрипты Framekiller в значительной степени были заменены использованием X-Frame-Options
и Content-Security-Policy
headers , которые в первую очередь предотвращают загрузку страницы во фрейме. Эти заголовки поддерживаются всеми современными браузерами и не требуют использования JavaScript . [1] Эти заголовки также предназначены для указания внутри программного обеспечения веб-сервера , а не непосредственно внутри HTML.
Реализации
[ редактировать ]Фреймкиллеры реализованы с использованием JavaScript , который проверяет, является ли текущее окно главным. Рекомендуемый подход — блокировать рендеринг окна по умолчанию и разблокировать его только после подтверждения того, что текущее окно является основным:
<style>html{display:none;}</style>
<script>
if (self == top) {
document.documentElement.style.display = 'block';
} else {
top.location = self.location;
}
</script>
Этот подход был предложен в 2010 году Густавом Ридстедтом, Эли Бурштейном , Дэном Бонехом и Коллином Джексоном в статье, в которой подчеркивались ограничения существующих методов разрушения кадров, а также методы, позволяющие их обойти. [2]
Альтернативные решения
[ редактировать ]Альтернативный вариант — предоставить пользователю возможность определить, следует ли разрешить работу фреймкиллера.
var framekiller = false;
window.onbeforeunload = function() {
if (framekiller) {
return "..."; // any message that helps user to make decision
}
};
и приведенный ниже код следует добавить после тега кадра:
//"my_frame" should be changed according to the real id of the frame in your page
document.getElementById("my_frame").onload = function() {
framekiller = true;
};
Оригинальные фреймкиллеры
[ редактировать ]Исторически сложилось так, что первые скрипты фреймкиллеров были такими простыми:
<script type="text/javascript">
if (top != self) top.location.replace(location);
</script>
Логика здесь заключалась в том, чтобы отобразить страницу, но проверить, совпадает ли верхнее местоположение с текущей страницей, и заменить верхнюю часть текущей, если нет. Однако этот метод можно легко обойти, заблокировав выполнение сценария Framebuster из внешнего фрейма. [2]
Ограничения фреймкиллера
[ редактировать ]Клиентское решение JavaScript опирается на браузер конечного пользователя, обеспечивающий собственную безопасность. Это делает его полезным, но ненадежным средством запрета внедрения вашей страницы в другие страницы. Следующие ситуации могут сделать приведенный выше сценарий бесполезным:
- Пользовательский агент не поддерживает JavaScript.
- Пользовательский агент поддерживает JavaScript, но пользователь отключил поддержку.
- Поддержка JavaScript в пользовательском агенте некорректна или реализована частично.
Антифреймкиллер
[ редактировать ]iframe в HTML5 имеет песочницы . Атрибут [3] Значение атрибута представляет собой набор разрешенных возможностей для содержимого iframe. Если значение пусто или не установлено, содержимое iframe не будет выполнять JavaScript и не позволит осуществлять навигацию верхнего уровня. Указав allow-scripts в наборе исключений, разделенных пробелами в значении, iframe разрешит JavaScript, но все равно запретит навигацию верхнего уровня, что сделает фреймкиллеры в iframe бессильными.
См. также
[ редактировать ]- Clickjacking — обсуждаются более сложные методы предотвращения встраивания в фрейм, такие как заголовок X-Frame-Options.
Ссылки
[ редактировать ]- ^ «CSP: рамки-предки» . Проверено 27 сентября 2023 г.
- ^ Перейти обратно: а б Г. Ридстедт; Э. Бурштейн; Д. Бонех; К. Джексон (2010). «Перебор фреймов: исследование уязвимостей кликджекинга на популярных сайтах» . 3-й семинар по безопасности и конфиденциальности Web 2.0 . IEEE.
- ^ «Архивная копия» . Архивировано из оригинала 6 июня 2013 г. Проверено 1 ноября 2014 г.
{{cite web}}
: CS1 maint: архивная копия в заголовке ( ссылка )