Преодоление "Отображение запрещено с помощью X-Frame-Options"

Я пишу крошечную веб-страницу, целью которой является создание нескольких других страниц, просто чтобы объединить их в одно окно браузера для удобства просмотра. Некоторые из страниц, которые я пытаюсь создать, запрещают создавать рамки и бросать "Отказано, чтобы отображать документ, потому что отображение запрещено с помощью X-Frame-Options". в Chrome. Я понимаю, что это ограничение безопасности (по уважительной причине), и у меня нет доступа к его изменению.

Есть ли какой-либо альтернативный способ кадрирования или без кадрирования для отображения страниц в одном окне, которые не будут обработаны заголовком X-Frame-Options?

Ответ 1

У меня была аналогичная проблема, когда я пытался отображать содержимое на нашем собственном сайте в iframe (в качестве диалогового окна в стиле лайтбокса с Colorbox) и где у нас был серверный заголовок X-Frame-Options SAMEORIGIN на исходном сервере, который не позволял ему загружаться на нашем тестовом сервере.

Это нигде не документируется, но если вы можете редактировать страницы, которые вы пытаетесь использовать iframe (например, это ваши собственные страницы), просто отправляя другой заголовок X-Frame-Options с любой строкой вообще отключает команды SAMEORIGIN или DENY.

например. для PHP, помещая

<?php
    header('X-Frame-Options: GOFORIT'); 
?>

в верхней части страницы заставит браузеры объединить два, что приведет к заголовку

X-Frame-Options SAMEORIGIN, GOFORIT

... и позволяет загружать страницу в iframe. Кажется, что это работает, когда начальная команда SAMEORIGIN была установлена ​​на уровне сервера, и вы хотели бы переопределить ее в каждом отдельном случае.

Все самое лучшее!

Ответ 2

Если вы получаете эту ошибку для видео YouTube, вместо того, чтобы использовать полный URL-адрес, используйте URL-адрес встраивания из параметров совместного доступа. Он будет выглядеть как http://www.youtube.com/embed/eCfDxZxTBW4

Вы также можете заменить watch?v= на embed/, поэтому http://www.youtube.com/watch?v=eCfDxZxTBW4 станет http://www.youtube.com/embed/eCfDxZxTBW4

Ответ 3

Если вы получаете эту ошибку при попытке вставить карту Google в iframe, вам нужно добавить &output=embed к исходной ссылке.

Ответ 5

Добавление

  target='_top'

к моей ссылке на вкладке facebook исправлена ​​проблема для меня...

Ответ 8

У меня была такая же проблема, когда я попытался добавить moodle 2 в iframe, решение Site administration ► Security ► HTTP security и проверить Allow frame embedding

Ответ 9

Это ребята решения!

FB.Event.subscribe('edge.create', function(response) {
    window.top.location.href = 'url';
});

Единственное, что работало для приложений facebook!

Ответ 10

Я попробовал почти все предложения. Однако единственное, что действительно решило проблему, было:

  • Создайте .htaccess в той же папке, где находится ваш PHP файл.

  • Добавьте эту строку в htaccess:

    Header always unset X-Frame-Options

Встраивание PHP с помощью iframe из другого домена должно работать впоследствии.

Кроме того, вы можете добавить в начало вашего PHP файла:

header('X-Frame-Options: ALLOW');

Это было, однако, не обязательно в моем случае.

Ответ 11

Похоже, что X-Frame-Options Allow-From https://... обесценивается и заменяется (и игнорируется), если вместо этого вы используете заголовок Content-Security-Policy.

Вот полная ссылка: https://content-security-policy.com/

Ответ 12

Решение для загрузки внешнего веб-сайта в iFrame даже жестко, вариант x-frame установлен на отказ на внешнем веб-сайте.

Если вы хотите загрузить другой веб-сайт в iFrame, и вы получите сообщение " Display forbidden by X-Frame-Options" вы можете действительно преодолеть это, создав прокси-сервер на стороне сервера.

Атрибут src для iFrame может иметь URL-адрес, похожий на этот: /proxy.php?url=https://www.example.com/page&key=somekey

Тогда proxy.php будет выглядеть примерно так:

if (isValidRequest()) {
   echo file_get_contents($_GET['url']);
}

function isValidRequest() {
    return $_SERVER['REQUEST_METHOD'] === 'GET' && isset($_GET['key']) && 
    $_GET['key'] === 'somekey';
}

Это передается блоком, потому что это просто запрос GET, который может быть обычным посещением страницы браузера.

Помните: вы можете улучшить безопасность в этом скрипте. Поскольку хакеры могут загружаться на веб-страницах через ваш прокси-скрипт.

Ответ 13

У меня была та же проблема с mediawiki, потому что сервер отказал в встраивании страницы в iframe по соображениям безопасности.

Я решил написать

$wgEditPageFrameOptions = "SAMEORIGIN"; 

в файл конфигурации mediawiki php.

Надеюсь, что это поможет.

Ответ 14

FWIW:

У нас была ситуация, когда нам нужно было убить наш iFrame, когда появился этот код "breaker". Итак, я использовал PHP function get_headers($url);, чтобы проверить удаленный URL, прежде чем показывать его в iFrame. Для лучшей производительности я кэшировал результаты в файл, чтобы каждый раз не создавать HTTP-соединение.

Ответ 15

Я использовал Tomcat 8.0.30, ни один из предложений не работал у меня. Поскольку мы хотим обновить X-Frame-Options и установить его в ALLOW, вот как я настроил разрешить встроенные iframes:

  • Перейдите в каталог Tomcat conf, отредактируйте файл web.xml
  • Добавьте фильтр ниже:
<filter>
            <filter-name>httpHeaderSecurity</filter-name>
            <filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
                   <init-param>
                           <param-name>hstsEnabled</param-name>
                           <param-value>true</param-value>
                   </init-param>
                   <init-param>
                           <param-name>antiClickJackingEnabled</param-name>
                           <param-value>true</param-value>
                   </init-param>
                   <init-param>
                           <param-name>antiClickJackingOption</param-name>
                           <param-value>ALLOW-FROM</param-value>
                   </init-param>
            <async-supported>true</async-supported>
       </filter>

       <filter-mapping>
                   <filter-name>httpHeaderSecurity</filter-name>
                   <url-pattern>/*</url-pattern>
                   <dispatcher>REQUEST</dispatcher>
       </filter-mapping> 
  • Перезагрузить службу Tomcat
  • Доступ к ресурсам с помощью iFrame.

Ответ 16

Единственный вопрос, который содержит кучу ответов. Удостоверьтесь в путеводителе, которого я хотел бы, когда я пытался с этим справиться, чтобы он работал в 10:30 ночью в день истечения срока... FB делает некоторые странные вещи с приложениями для холста, и хорошо, вас предупреждают. Если вы все еще здесь, и у вас есть приложение Rails, которое появится за Facebook Canvas, вам понадобится:

Gemfile:

gem "rack-facebook-signed-request", :git => 'git://github.com/cmer/rack-facebook-signed-request.git'

конфигурации /facebook.yml

facebook:
  key: "123123123123"
  secret: "123123123123123123secret12312"

конфигурации /application.rb

config.middleware.use Rack::Facebook::SignedRequest, app_id: "123123123123", secret: "123123123123123123secret12312", inject_facebook: false

конфигурации/инициализаторы/omniauth.rb

OmniAuth.config.logger = Rails.logger
SERVICES = YAML.load(File.open("#{::Rails.root}/config/oauth.yml").read)
Rails.application.config.middleware.use OmniAuth::Builder do
  provider :facebook, SERVICES['facebook']['key'], SERVICES['facebook']['secret'], iframe:   true
end

application_controller.rb

before_filter :add_xframe
def add_xframe
  headers['X-Frame-Options'] = 'GOFORIT'
end

Вам нужен контроллер для вызова из настроек холста Facebook, я использовал /canvas/ и сделал маршрут для основного SiteController для этого приложения:


class SiteController < ApplicationController
  def index
    @user = User.new
  end
  def canvas
    redirect_to '/auth/failure' if request.params['error'] == 'access_denied'
    url = params['code'] ? "/auth/facebook?signed_request=#{params['signed_request']}&state=canvas" : "/login"
    redirect_to url
  end
  def login
  end
end

login.html.erb


&lt% content_for :javascript do %>
  var oauth_url = 'https://www.facebook.com/dialog/oauth/';
  oauth_url += '?client_id=471466299609256';
  oauth_url += '&redirect_uri=' + encodeURIComponent('https://apps.facebook.com/wellbeingtracker/');
  oauth_url += '&scope=email,status_update,publish_stream';
console.log(oauth_url);
  top.location.href = oauth_url;
&lt% end %>

Источники

  • Конфигурация, на мой взгляд, взята из примера omniauth.
  • Файл gem (который является ключом!!!) пришел из: слайд-шоу, о котором я узнал...
  • Этот стекный вопрос имел весь угол Xframe, поэтому вы получите пустое пространство, если вы не помещаете этот заголовок в контроллер приложения.
  • И мой человек @rafmagana написал это руководство heroku, которое теперь вы можете принять за рельсы с этим ответом и плечами гигантов, в которых вы ходить с.

Ответ 17

целевой = "_ родителя

Используя идею Кевина Веллы, я попытался добавить этот атрибут, чтобы сформировать элементы, созданные генератором кнопок PayPal. Работал для меня, чтобы Paypal не открывался в новом окне браузера/вкладке.

Ответ 18

Если вы получаете эту ошибку для Facebook-приложения и используете AJAX-звонки, я читаю где-то, что Facebook действительно любит использовать # тега для этого ajax-контакта, поэтому попробуйте сменить ссылки, сработал у меня.

Ответ 19

Я не уверен, насколько это уместно, но я создал для этого обход. На моем сайте я хотел отобразить ссылку в модальном окне, содержащем iframe, который загружает URL-адрес.

Что я сделал, я связал событие click ссылки на эту функцию javascript. Все это делает запрос к файлу PHP, который проверяет заголовки URL-адресов для X-FRAME-Options перед тем, как решить, загружать ли URL-адрес в модальное окно или перенаправлять.

Здесь функция:

  function opentheater(link, title){
        $.get( "url_origin_helper.php?url="+encodeURIComponent(link), function( data ) {
  if(data == "ya"){
      $(".modal-title").html("<h3 style='color:480060;'>"+title+"&nbsp;&nbsp;&nbsp;<small>"+link+"</small></h3>");
        $("#linkcontent").attr("src", link);
        $("#myModal").modal("show");
  }
  else{
      window.location.href = link;
      //alert(data);
  }
});


        }

Вот код файла PHP, который проверяет его:

<?php
$url = rawurldecode($_REQUEST['url']);
$header = get_headers($url, 1);
if(array_key_exists("X-Frame-Options", $header)){
    echo "nein";
}
else{
    echo "ya";
}


?>

Надеюсь, что это поможет.

Ответ 20

Я столкнулся с этой проблемой при запуске веб-сайта wordpress. Я пробовал всевозможные вещи, чтобы исправить это, и не знал, как, в конечном счете, проблема была в том, что я использовал DNS-переадресацию с маскировкой, а ссылки на внешние сайты неправильно обрабатывались. т.е. мой сайт был размещен на http://123.456.789/index.html, но был замаскирован для запуска в http://somewebSite.com/index.html. Когда я ввел http://123.456.789/index.html в браузере, нажав на те же самые ссылки, в результате не возникли проблемы с X-фреймами в консоли JS, но запустил http://somewebSite.com/index.html. Чтобы правильно маскировать, вы должны добавить свои DNS-серверы хостов в свою службу домена, то есть у godaddy.com должны быть серверы имен, например ns1.digitalocean.com, ns2.digitalocean.com, ns3.digitalocean.com, если вы были используя digitalocean.com в качестве вашего хостинга.

Ответ 22

Удивительно, что никто здесь не упоминал Apache параметры сервера (*.conf files) или .htaccess как сам файл, являющийся причиной этой ошибки. Найдите в своих конфигурационных файлах .htaccess или Apache, чтобы у вас не было следующего набора DENY:

Header always set X-Frame-Options DENY

Изменив его на SAMEORIGIN, все будет работать так, как ожидалось:

Header always set X-Frame-Options SAMEORIGIN

Ответ 23

Единственный реальный ответ, если вы не контролируете заголовки вашего источника, который вы хотите в своем iframe, - это прокси-сервер. Попросите сервер действовать как клиент, получите источник, разделите проблемные заголовки, добавьте CORS, если необходимо, а затем выполните ping с вашего собственного сервера.

Есть еще один ответ, объясняющий, как написать такой прокси. Это не сложно, но я был уверен, что кто-то должен был это сделать раньше. По какой-то причине было трудно найти его.

Наконец, я нашел некоторые источники:

https://github.com/Rob--W/cors-anywhere/#documentation

^ предпочтительнее. Если вам нужно редкое использование, я думаю, вы можете просто использовать его приложение heroku. В противном случае, это код, чтобы запустить его самостоятельно на вашем собственном сервере. Обратите внимание, какие ограничения существуют.

whateverorigin.org

^ второй выбор, но довольно старый. предположительно более новый выбор в python: https://github.com/Eiledon/alloworigin

то есть третий выбор:

http://anyorigin.com/

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

Ответ 24

Используйте эту строку ниже, вместо функции header().

echo "<script>window.top.location = 'https://apps.facebook.com/yourappnamespace/';</script>";

Ответ 25

Не упоминается, но может помочь в некоторых случаях:

var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
    if (xhr.readyState !== 4) return;
    if (xhr.status === 200) {
        var doc = iframe.contentWindow.document;
        doc.open();
        doc.write(xhr.responseText);
        doc.close();
    }
}
xhr.open('GET', url, true);
xhr.send(null);

Ответ 27

Также убедитесь, что в вашем браузере включены сторонние файлы cookie. Мне потребовалось несколько часов, чтобы понять это, и это решило мою проблему.

Ответ 28

У меня была эта проблема, и она разрешила ее редактирование httd.conf

<IfModule headers_module>
    <IfVersion >= 2.4.7 >
        Header always setifempty X-Frame-Options GOFORIT
    </IfVersion>
    <IfVersion < 2.4.7 >
        Header always merge X-Frame-Options GOFORIT
    </IfVersion>
</IfModule>

Я изменил SAMEORIGIN на GOFORIT и перезапустил сервер

Ответ 30

Попробуйте эту штуку, я не думаю, что кто-то предложил это в теме, это решит, как 70% вашей проблемы, для некоторых других страниц вам придется отказаться, у меня есть полное решение, но не для публики,

ДОБАВИТЬ ниже в ваш iframe

sandbox = "allow-same-origin allow-scripts allow-popups allow-forms"