Как установить '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

rubo77
источник
Это помогло мне. Я закомментировал эти две строки: 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 *"
Майк Q
источник
5

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

 <system.webServer>
     <httpProtocol allowKeepAlive="true" >
       <customHeaders>
         <add name="X-Frame-Options" value="*" />
       </customHeaders>
     </httpProtocol>
 </system.webServer>
LongChalk
источник
Это похоже на решение, но является ли это брешей в безопасности?
Йогурту
1
Это не очень хорошая идея , чтобы отключить ту же политику происхождения для вашего сайта , если вы точно не знаете , что вы делаете. Вы не должны позволять доменам, отличным от вашего, встраивать контент. Смотрите codecademy.com/articles/what-is-cors и аналогичные учебные пособия.
Slhck
5

и если ничего не помогает, и вы все еще хотите представить этот сайт в iframe, подумайте об использовании компонента X Frame Bypass, который будет использовать прокси.

Томер Бен Дэвид
источник
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>
Nikki
источник
если я хочу открыть 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>
Rejji
источник
-3

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

    <security:headers>
        <security:frame-options />
        <security:cache-control />
        <security:content-type-options />
        <security:xss-protection />
    </security:headers>
<security:http>
Бикаш Пандит
источник