Преодоление " дисплея, запрещенного X-Frame-Options"
Я пишу крошечную веб-страницу, цель которой-создать несколько других страниц, просто объединить их в одно окно браузера для удобства просмотра. Несколько страниц, которые я пытаюсь создать, запрещают быть обрамленными и бросают " отказано в отображении документа, потому что отображение запрещено X-Frame-Options."ошибка в Chrome. Я понимаю, что это ограничение безопасности (по уважительной причине), и не имеют доступа, чтобы изменить его.
есть ли альтернатива обрамление или обрамление метод отображения страниц в одном окне, которое не будет отключено заголовком X-Frame-Options?
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; если это не работает, попробуйте обновить страницу.)процесс выглядит следующим образом:
- запрос URL-адреса iframe из YQL (функция
loadURL
),- получить HTML-данные из YQL (функция
getData
),- добавить a
<base link>
и<script>
загрузка ссылок в iframe с помощью YQL, а также,- введите этот 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);
Если вы получаете эту ошибку, пытаясь внедрить содержимое Vimeo, измените src iframe,
от:https://vimeo.com/63534746
to:http://player.vimeo.com/video/63534746
у меня была такая же проблема, когда я попытался встроить moodle 2 в iframe, решение
Site administration ► Security ► HTTP security
иAllow frame embedding
Это решение ребята!!
FB.Event.subscribe('edge.create', function(response) { window.top.location.href = 'url'; });
единственное, что работало для приложений facebook!
Я пробовал почти все предложения. Однако единственное, что действительно решило проблему, было:
создать
.htaccess
в той же папке, где находится ваш PHP-файл.добавьте эту строку в 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.Эрб
<% 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; <% end %>
источник
- конфигурация, я думаю, пришла из примера omniauth.
- файл gem (который является ключевым!!!) пришел от:slideshare вещи, которые я узнал...
- этот вопрос стека имел весь угол Xframe, поэтому вы получите пустое место, если вы не помещаете этот заголовок в контроллер приложения.
- и мой человек @rafmagana написал это heroku guide, который теперь вы можете принять за рельсы с этим ответом и плечами гигантов, в которых вы ходите.
target= '_parent'
используя идею Кевина Веллы, я попытался добавить этот атрибут для формирования элементов, созданных генератором кнопок PayPal. Работал для меня так, что Paypal не открывается в новом окне браузера/вкладке.
FWIW:
у нас была ситуация, когда нам нужно было убить наших
iFrame
когда этот "выключатель" код появился. Итак, я использовал PHPfunction 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+" <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
тут третий вариант:
который, кажется, позволяет немного свободного использования, но поставит вас в публичный список стыда, если вы не платите и используете некоторую неопределенную сумму, которую вы можете удалить только в том случае, если вы платите плату...
не упоминается, но может помочь в некоторых случаях:
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
песочница="разрешить-же происхождения позволяют-скрипты разрешить всплывающие окна разрешить-форм"