Преодоление " дисплея, запрещенного X-Frame-Options"


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

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

25 394

25 ответов:

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

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

например. для PHP, ставишь

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

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

X-Frame-Options SAMEORIGIN, GOFORIT

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

всего наилучшего!

если вы получаете эту ошибку для видео 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

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

вы можете обход X-Frame-Options на <iframe> используя только клиентский JavaScript и YQL. Вот доказательство концепции: хакер Новости в <iframe>. (Протестировано в Chrome & Firefox; если это не работает, попробуйте обновить страницу.)

процесс выглядит следующим образом:

  1. запрос URL-адреса iframe из YQL (функция loadURL),
  2. получить HTML-данные из YQL (функция getData),
  3. добавить a <base link> и <script> загрузка ссылок в iframe с помощью YQL, а также,
  4. введите этот HTML в пустой <iframe> (функция loadHTML).

пример кода JS:

var iframe = document.getElementsByTagName('iframe')[0];
var url = iframe.src;
var getData = function (data) {
    if (data && data.query && data.query.results && data.query.results.resources && data.query.results.resources.content && data.query.results.resources.status == 200) loadHTML(data.query.results.resources.content);
    else if (data && data.error && data.error.description) loadHTML(data.error.description);
    else loadHTML('Error: Cannot load ' + url);
};
var loadURL = function (src) {
    url = src;
    var script = document.createElement('script');
    script.src = 'https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20data.headers%20where%20url%3D%22' + encodeURIComponent(url) + '%22&format=json&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback=getData';
    document.body.appendChild(script);
};
var loadHTML = function (html) {
    iframe.src = 'about:blank';
    iframe.contentWindow.document.open();
    iframe.contentWindow.document.write(html.replace(/<head>/i, '<head><base href="' + url + '"><scr' + 'ipt>document.addEventListener("click", function(e) { if(e.target && e.target.nodeName == "A") { e.preventDefault(); parent.loadURL(e.target.href); } });</scr' + 'ipt>'));
    iframe.contentWindow.document.close();
} 
loadURL(iframe.src);

добавлять

  target='_top'

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

Если вы получаете эту ошибку, пытаясь внедрить содержимое Vimeo, измените src iframe,

от:https://vimeo.com/63534746
to:http://player.vimeo.com/video/63534746

есть плагин для Chrome, который удаляет эту запись заголовка (только для личного использования):

https://chrome.google.com/webstore/detail/ignore-x-frame-headers/gleekbfjekiniecknbkamfmkohkpodhe/reviews

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

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

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

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

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

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

  2. добавьте эту строку в htaccess:

    Header always unset X-Frame-Options

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

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

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

который, однако, не был необходим в моем случае.

получается, что X-Frame-параметры позволяют - от https://... амортизируется и заменяется (и игнорируется), если вы используете Content-Security-Policy заголовок.

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

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

Я решил писать!--2-->

$wgEditPageFrameOptions = "SAMEORIGIN"; 

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

надеюсь, что это помогает.

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

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

The src атрибут iFrame может иметь url-адрес, выглядящий следующим образом:/proxy.php?url=https://www.example.com/page&key=somekey

затем прокси-сервер.php будет выглядеть что-то например:

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

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

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

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

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

  • перейдите в каталог Tomcat conf, отредактируйте веб.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.

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

Gemfile:

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

config / facebook.в формате YML

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

config / application.РБ

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

config / initializers / omniauth.РБ

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.РБ

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

логин.формат html.Эрб


&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 (который является ключевым!!!) пришел от:slideshare вещи, которые я узнал...
  • этот вопрос стека имел весь угол Xframe, поэтому вы получите пустое место, если вы не помещаете этот заголовок в контроллер приложения.
  • и мой человек @rafmagana написал это heroku guide, который теперь вы можете принять за рельсы с этим ответом и плечами гигантов, в которых вы ходите.

target= '_parent'

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

FWIW:

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

Я не уверен, насколько это актуально, но я построил работу вокруг этого. На моем сайте я хотел отобразить ссылку в модальном окне, которое содержало 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";
}


?>

надеюсь, что это помогает.

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

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

Header always set X-Frame-Options DENY

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

Header always set X-Frame-Options SAMEORIGIN

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

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

Я наконец-то нашел некоторые источники:

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

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

whateverorigin.org

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

тут третий вариант:

http://anyorigin.com/

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

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

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);

используйте эту строку, приведенную ниже вместо

У меня была эта проблема, и я решил ее редактирование 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 и перезапустил сервер

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

добавить ниже в ваш iframe

песочница="разрешить-же происхождения позволяют-скрипты разрешить всплывающие окна разрешить-форм"