Преодоление "дисплей Запрещенные параметры фрейма X"

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

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

25 ответов


у меня была аналогичная проблема, когда я пытался отобразить контент с нашего собственного сайта в 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 была установлена на уровне сервера, и вы хотите переопределить ее на странице за страницей.

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


если вы получаете эту ошибку для видео YouTube, а не с помощью полного url-адреса, используйте URL-адрес embed из параметров share. Это будет выглядеть как 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 на ссылка на источник.


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

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

  1. запросить URL iframe из YQL (функция loadURL),
  2. получить HTML-данные из YQL (функция getData),
  3. добавить a <base link> и a <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,

from:https://vimeo.com/63534746
кому: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” ошибка, то вы можете фактически преодолеть это, создав сценарий прокси на стороне сервера.

на 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"

конфиг/приложения.rb

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

config / инициализаторы / 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 для этого app:


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, поэтому вы получите пустое место, если вы не помещаете этот заголовок в App controller.
  • и мой человек @rafmagana написал это heroku guide, который теперь вы можете принять за рельсы с этим ответом и плечами гигантов, в которых вы ходите.

target= '_parent'

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


FWIW:

у нас была ситуация, когда нам нужно было убить наших iFrame когда появился этот код "breaker". Итак, я использовал 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, если необходимо, а затем выполнить ping собственного сервера.

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

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

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

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