Симон Моурир дал этот пример :
object o = null;
DateTime d = (DateTime)o; // NullReferenceException
, где unboxing преобразование (литье) из object
(или из одного из классов System.ValueType
или System.Enum
или из типа интерфейса) - тип значения (кроме Nullable<>
) сам по себе дает NullReferenceException
.
В другом направлении конверсия бокса из a Nullable<>
, которая имеет HasValue
, равную false
, на ссылочный тип, может дать ссылку null
, которая затем может привести к NullReferenceException
. Классический пример:
DateTime? d = null;
var s = d.ToString(); // OK, no exception (no boxing), returns ""
var t = d.GetType(); // Bang! d is boxed, NullReferenceException
Иногда бокс происходит по-другому. Например, с помощью этого не общего метода расширения:
public static void MyExtension(this object x)
{
x.ToString();
}
следующий код будет проблематичным:
DateTime? d = null;
d.MyExtension(); // Leads to boxing, NullReferenceException occurs inside the body of the called method, not here.
Эти случаи возникают из-за специальных правил, используемых во время выполнения при боксе Nullable<>
экземпляров.
У меня была аналогичная проблема, когда я пытался отображать содержимое на нашем собственном сайте в 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 была установлена на уровне сервера, и вы хотели бы переопределить ее в каждом отдельном случае.
Все самое лучшее!
У меня была эта проблема, и я решил изменить httpd.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, чтобы перейти к нему, и перезапустил сервер
Похоже, что X-Frame-Options Allow-From https: // ... обесценивается и заменяется (и игнорируется), если вместо этого используется заголовок Content-Security-Policy.
Здесь это полная ссылка: https://content-security-policy.com/
Если вы пытаетесь внедрить Vimeo в эту ошибку, измените src iframe, от: https://vimeo.com/63534746 до: http: // player.vimeo.com/video/63534746
Решение для загрузки внешнего веб-сайта в 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, который также может быть обычным посещением страницы браузера.
Знайте: вы можете улучшить безопасность в этом скрипте. Поскольку хакеры могут загружаться на веб-страницах через ваш прокси-скрипт.
Я использовал Tomcat 8.0.30, ни один из предложений не работал для меня. Поскольку мы хотим обновить X-Frame-Options
и установить его на ALLOW
, вот как я настроил разрешить встроенные iframes:
<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>
Удивительно, что никто из них никогда не упоминал настройки сервера Apache
сервера (*.conf
) или .htaccess
как причину этой ошибки. Найдите в файлах конфигурации .htaccess
или Apache
, чтобы убедиться, что у вас нет следующего набора DENY
:
Header always set X-Frame-Options DENY
Смените его на SAMEORIGIN
, делает работу так, как ожидалось:
Header always set X-Frame-Options SAMEORIGIN
target = '_ parent'
Используя идею Кевина Веллы, я попытался добавить этот атрибут, чтобы сформировать элементы, созданные генератором кнопок PayPal. Работала для меня, чтобы Paypal не открывался в новом окне браузера / вкладке.
У меня была такая же проблема с mediawiki, потому что сервер отказал в встраивании страницы в iframe по соображениям безопасности.
Я решил записать
$wgEditPageFrameOptions = "SAMEORIGIN";
в Файл конфигурации mediawiki php.
Надеюсь, что это поможет.
Я попробовал почти все предложения. Однако единственное, что действительно решило проблему, было:
.htaccess
в той же папке, где находится ваш PHP-файл. Header always unset X-Frame-Options
Встраивание PHP с помощью iframe из другого домена должно работать позже.
Кроме того, вы могли бы добавить в начало вашего PHP-файла:
header('X-Frame-Options: ALLOW');
Это было, однако, не обязательно в моем случае.
Добавление
target='_top'
к моей ссылке на вкладке facebook устраняет проблему для меня ...
Я столкнулся с этой проблемой при запуске веб-сайта 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 в качестве вашего хостинга.
Это ребята!
FB.Event.subscribe('edge.create', function(response) {
window.top.location.href = 'url';
});
Единственное, что работало в приложениях facebook!
Единственный реальный ответ, если вы не контролируете заголовки источника, который вы хотите в своем iframe, это прокси-сервер. Попросите сервер действовать как клиент, получите источник, разделите проблемные заголовки, добавьте CORS, если необходимо, а затем выполните ping на своем собственном сервере.
Есть еще один ответ, объясняющий, как писать такой прокси. Это не сложно, но я был уверен, что кто-то должен был это сделать раньше. По какой-то причине было трудно найти его.
Я, наконец, нашел некоторые источники:
https://github.com/Rob--W/cors -anywhere / # documentation
^ предпочтительнее. Если вам нужно редкое использование, я думаю, вы можете просто использовать его приложение heroku. В противном случае, это код для запуска его самостоятельно на вашем собственном сервере. Заметьте, какие ограничения существуют.
anyorigin.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);
У меня была такая же проблема, когда я попытался внедрить moodle 2 в iframe, решение - Site administration ► Security ► HTTP security
и проверить Allow frame embedding
Единственный вопрос, который имеет кучу ответов. Удостоверьтесь в путеводителе, которого я хотел бы, когда я пытался с этим справиться, чтобы он работал в 10:30 ночью в день истечения срока ... FB делает некоторые странные вещи с приложениями для холста, и хорошо, вас предупреждают. Если вы все еще здесь, и у вас есть приложение Rails, которое появится за Facebook Canvas, вам понадобится:
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.rb
config.middleware.use Rack::Facebook::SignedRequest, app_id: "123123123123", secret: "123123123123123123secret12312", inject_facebook: false
config / initializers / 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
<% 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 %>
Источники
Если вы получаете эту ошибку при попытке вставить карту Google в iframe
, вам нужно добавить &output=embed
к исходной ссылке.
Используйте эту строку ниже, вместо функции header()
.
echo "<script>window.top.location = 'https://apps.facebook.com/yourappnamespace/';</script>";
Я не уверен, насколько это уместно, но я создал для этого обход. На моем сайте я хотел отобразить ссылку в модальном окне, содержащем 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";
}
?>
Надеюсь, это поможет.
Вы можете обойти X-Frame-Options
в <iframe>
, используя только клиентский JavaScript и YQL . Вот доказательство концепции: Hacker News в <iframe>
. (Проверено в Chrome & amp; Firefox, если оно не работает, попробуйте обновить страницу.)
Процесс выглядит следующим образом:
loadURL
), getData
), <base link>
и <script>
в iframe, используя YQL, <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);
В Chrome есть плагин для этого заголовка (для личного использования):
Если вы получаете эту ошибку для видео 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
Попробуйте эту штуку, я не думаю, что кто-то предложил это в теме, это решит, как 70% вашей проблемы, для некоторых других страниц вам придется отказаться, у меня есть полное решение, но не для публики,
ДОБАВИТЬ ниже в ваш iframe
песочница = разрешить разрешающие скрипты разрешать-всплывающие окна разрешать-формы "