Как установить 'X-Frame-Options' в iframe?


170

Если я создаю iframeкак это:

var dialog = $('<div id="' + dialogId + '" align="center"><iframe id="' + frameId + '" src="' + url + '" width="100%" frameborder="0" height="'+frameHeightForIe8+'" data-ssotoken="' + token + '"></iframe></div>').dialog({

Как я могу исправить ошибку:

Отказался отображать 'https://www.google.com.ua/?gws_rd=ssl'в кадре, потому что он установил «X-Frame-Options» на «SAMEORIGIN».

с JavaScript?

Ответы:


227

Вы не можете установить X-Frame-Optionsна iframe. Это заголовок ответа, установленный доменом, из которого вы запрашиваете ресурс ( google.com.uaв вашем примере). В SAMEORIGINэтом случае они установили заголовок , что означает, что они запретили загрузку ресурса за iframeпределами своего домена. Для получения дополнительной информации см . Заголовок ответа X-Frame-Options на MDN.

Быстрая проверка заголовков (показанная здесь в инструментах разработчика Chrome) выявляет X-Frame-Optionsзначение, возвращаемое хостом.

введите описание изображения здесь


7
С помощью YouTube вы можете изменить URL-адрес конечной точки на версию для встраивания. См. Stackoverflow.com/questions/25661182/… (я знаю, что это не совсем то, что ищет ОП, но сначала Google дает этот результат!)

73

X-Frame-Optionsявляется заголовком, включенным в ответ на запрос, чтобы указать, позволит ли запрашиваемый домен отображаться в кадре. Он не имеет ничего общего с javascript или HTML и не может быть изменен отправителем запроса.

Этот веб-сайт установил этот заголовок, чтобы запретить его отображение в iframe. Клиент ничего не может сделать, чтобы остановить это поведение.

Дальнейшее чтение по X-Frame-Options


Он устанавливается в заголовке ответа, а не в заголовке запроса. Но в остальном точное объяснение!
Nickang

2
@nickang это то, что я имел в виду, однако я согласен, что терминология не ясна. Я отредактировал это, чтобы удалить любую путаницу. Спасибо.
Рори МакКроссан

31

Если вы контролируете Сервер, который отправляет содержимое iframe, вы можете установить этот параметр на X-Frame-Optionsсвоем веб-сервере.

Настройка Apache

Чтобы отправить заголовок X-Frame-Options для всех страниц, добавьте это в конфигурацию вашего сайта:

Header always append X-Frame-Options SAMEORIGIN

Конфигурирование nginx

Чтобы настроить nginx на отправку заголовка X-Frame-Options, добавьте его в конфигурацию http, сервера или местоположения:

add_header X-Frame-Options SAMEORIGIN;

Нет конфигурации

Этот параметр заголовка является необязательным, поэтому, если этот параметр вообще не установлен, вы сможете настроить его для следующего экземпляра (например, для браузера посетителей или прокси-сервера).

источник: https://developer.mozilla.org/en-US/docs/Web/HTTP/X-Frame-Options


Это помогло мне. Я закомментировал эти две строки: add_header Strict-Transport-Security "max-age=86400; includeSubdomains"; add_header X-Frame-Options DENY;из фрагментов nginx, а затем все сразу заработало.
Зет

NGINX, важно сказать, где , внутри места?
Питер Краусс

Питер Краус, что ты хочешь?
rubo77

14

Поскольку решение не было упомянуто для серверной стороны:

Нужно установить такие вещи (пример из Apache), это не лучший вариант, так как позволяет во всем, но после того, как вы увидите, что ваш сервер работает правильно, вы можете легко изменить настройки.

           Header set Access-Control-Allow-Origin "*"
           Header set X-Frame-Options "allow-from *"

5

не очень ... я использовал

 <system.webServer>
     <httpProtocol allowKeepAlive="true" >
       <customHeaders>
         <add name="X-Frame-Options" value="*" />
       </customHeaders>
     </httpProtocol>
 </system.webServer>

Это похоже на решение, но является ли это брешей в безопасности?
Йогурту

1
Это не очень хорошая идея , чтобы отключить ту же политику происхождения для вашего сайта , если вы точно не знаете , что вы делаете. Вы не должны позволять доменам, отличным от вашего, встраивать контент. Смотрите codecademy.com/articles/what-is-cors и аналогичные учебные пособия.
Slhck


2

X-Frame-Options HTTP - заголовок ответа может быть использован , чтобы указать , должен ли браузер разрешено отобразить страницу в <frame>, <iframe>или <object>. Сайты могут использовать это, чтобы избежать атак с использованием кликов, гарантируя, что их контент не будет встроен в другие сайты.

Для получения дополнительной информации: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options

У меня есть альтернативное решение этой проблемы, которое я собираюсь продемонстрировать с помощью PHP:

iframe.php:

<iframe src="target_url.php" width="925" height="2400" frameborder="0" ></iframe>

target_url.php:

<?php 
  echo file_get_contents("http://www.example.com");
?>

5
Это жизнеспособное решение использовать страницу после ее загрузки? Смогу ли я взаимодействовать со страницами после начальной загрузки? Разве не каждый запрос на домен должен быть прокси для использования контента после его загрузки?
Тимоти Гонсалес

0

Для этого вам нужно соответствовать местоположению в вашем Apache или любой другой службе, которую вы используете

Если вы используете apache, то в файле httpd.conf.

  <LocationMatch "/your_relative_path">
      ProxyPass absolute_path_of_your_application/your_relative_path
      ProxyPassReverse absolute_path_of_your_application/your_relative_path
   </LocationMatch>

0

Решение - установить плагин для браузера.

Веб-сайт, который выдает заголовок HTTP X-Frame-Optionsсо значением DENY(или SAMEORIGINс другим источником сервера), не может быть интегрирован в IFRAME ... если вы не измените это поведение, установив плагин Browser, который игнорирует X-Frame-Optionsзаголовок (например, Chrome Ignore X-Frame Headers ).

Обратите внимание, что это не рекомендуется вообще по соображениям безопасности.


0

вы можете установить x-frame-option в веб-конфигурации сайта, который вы хотите загрузить в iframe, вот так

<httpProtocol>
    <customHeaders>
      <add name="X-Frame-Options" value="*" />
    </customHeaders>
  </httpProtocol>

если я хочу открыть stackoverflow, где я могу найти веб-конфигурацию? не для серверной части?
Ирум Захра

-1

Вы не можете добавить x-iframe в свое тело HTML, так как он должен быть предоставлен владельцем сайта и находится в рамках правил сервера.

Вероятно, вы можете создать PHP-файл, который загружает содержимое целевого URL-адреса и вставляет этот php-URL, это должно работать без сбоев.


1
«Вы можете, вероятно», а затем опубликовать его в качестве комментария, если это не ответ
MK

Что, если это окажется ответом MK
Sushant Chaudhari

Тогда это предложение, которое сработало, а не конкретное решение, поэтому его следует поместить в качестве комментария
MK

-2

Вы можете сделать это в файле конфигурации уровня экземпляра tomcat (web.xml), добавив 'filter' и filter-mapping 'в файл конфигурации web.xml. это добавит [X-frame-options = DENY] на всю страницу, так как это глобальная настройка.

<filter>
        <filter-name>httpHeaderSecurity</filter-name>
        <filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
        <async-supported>true</async-supported>
        <init-param>
          <param-name>antiClickJackingEnabled</param-name>
          <param-value>true</param-value>
        </init-param>
        <init-param>
          <param-name>antiClickJackingOption</param-name>
          <param-value>DENY</param-value>
        </init-param>
    </filter>

  <filter-mapping> 
    <filter-name>httpHeaderSecurity</filter-name> 
    <url-pattern>/*</url-pattern>
</filter-mapping>

-3

Если вы следуете XML-подходу, то приведенный ниже код будет работать.

    <security:headers>
        <security:frame-options />
        <security:cache-control />
        <security:content-type-options />
        <security:xss-protection />
    </security:headers>
<security:http>
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.