Элемент IFRAME
может представлять угрозу безопасности, если ваш сайт встроен в IFRAME
на враждебном сайте . Google "clickjacking" для более подробной информации. Обратите внимание, что не имеет значения, если вы используете <iframe>
или нет. Единственная реальная защита от этой атаки - добавить HTTP-заголовок X-Frame-Options: DENY
и надеяться, что браузер знает свою работу.
Кроме того, элемент IFRAME может представлять угрозу безопасности, если какая-либо страница на вашем сайте содержит уязвимость XSS, которую можно использовать . В этом случае злоумышленник может распространить атаку XSS на любую страницу в том же домене, которую можно убедить загрузить в пределах <iframe>
на странице с уязвимостью XSS. Это связано с тем, что контенту того же источника (того же домена) разрешен доступ к родительскому контенту DOM (практически выполняется JavaScript в документе "host"). Единственный реальный способ защиты от этой атаки - добавить HTTP-заголовок X-Frame-Options: DENY
и / или всегда правильно кодировать все данные, отправленные пользователем (то есть никогда не иметь XSS-уязвимости на вашем сайте - легче сказать, чем сделать).
Это техническая сторона вопроса. Кроме того, существует проблема пользовательского интерфейса. Если вы научите своих пользователей доверять тому, что строка URL-адресов не должна меняться при нажатии на ссылки (например, на вашем сайте используется большой iframe со всем фактическим контентом), тогда пользователи не заметят ничего в будущем и в случае фактической уязвимости безопасности. Например, у вас может быть уязвимость XSS на вашем сайте, которая позволяет злоумышленнику загружать контент из враждебного источника в ваш iframe. Никто не может заметить разницу, потому что строка URL по-прежнему выглядит идентично предыдущему поведению (никогда не изменяется), а содержимое «выглядит» действительным, даже если оно из враждебного домена, запрашивающего учетные данные пользователя.
Если кто-то утверждает, что использование элемента <iframe>
на вашем сайте опасно и создает угрозу безопасности, он не понимает, что делает элемент <iframe>
, или говорит о возможности уязвимостей, связанных с <iframe>
в браузерах. Безопасность тега <iframe src="...">
равна <img src="..."
или <a href="...">
, если в браузере нет уязвимостей. И если есть подходящая уязвимость, возможно, ее можно будет запустить даже без использования элемента <iframe>
, <img>
или <a>
, поэтому не стоит рассматривать эту проблему.
Однако, следует помнить, что содержимое из <iframe>
может инициировать навигацию верхнего уровня по умолчанию . То есть контент в <iframe>
может автоматически открывать ссылку на текущее местоположение страницы (новое местоположение будет видно в адресной строке). Единственный способ избежать этого - добавить атрибут sandbox
без значения allow-top-navigation
. Например, <iframe sandbox="allow-forms allow-scripts" ...>
. К сожалению, песочница также всегда отключает все плагины. Например, содержимое Youtube не может быть помещено в «песочницу», поскольку Flash Player все еще требуется для просмотра всего содержимого Youtube. Ни один браузер не поддерживает одновременное использование плагинов и запрещает навигацию верхнего уровня.
Обратите внимание, что X-Frame-Options: DENY
также защищает от рендеринга производительности по побочным каналам, которая может считывать контент из разных источников (также известный как « Pixel perfect Timing Attacks »).