Вставить BBC News Live Stream Onto Web Page [дублировать]

Симон Моурир дал этот пример :

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<> экземпляров.

393
задан abraham 12 March 2012 в 20:01
поделиться

24 ответа

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

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

195
ответ дан mc10 24 August 2018 в 23:23
поделиться

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

0
ответ дан Arthur 24 August 2018 в 23:23
поделиться

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

Здесь это полная ссылка: https://content-security-policy.com/

5
ответ дан Dr. Aaron Dishno 24 August 2018 в 23:23
поделиться

Если вы пытаетесь внедрить Vimeo в эту ошибку, измените src iframe, от: https://vimeo.com/63534746 до: http: // player.vimeo.com/video/63534746

20
ответ дан Eric Corriel 24 August 2018 в 23:23
поделиться

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

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

4
ответ дан Floris 24 August 2018 в 23:23
поделиться

Я использовал 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.
2
ответ дан Giri 24 August 2018 в 23:23
поделиться

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

Header always set X-Frame-Options DENY

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

Header always set X-Frame-Options SAMEORIGIN

1
ответ дан Ilia Rostovtsev 24 August 2018 в 23:23
поделиться

target = '_ parent'

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

2
ответ дан jiminikiz 24 August 2018 в 23:23
поделиться

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

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

$wgEditPageFrameOptions = "SAMEORIGIN"; 

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

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

4
ответ дан John White 24 August 2018 в 23:23
поделиться

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

  1. Создайте .htaccess в той же папке, где находится ваш PHP-файл.
  2. Добавьте эту строку в htaccess : Header always unset X-Frame-Options

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

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

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

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

4
ответ дан Kai Noack 24 August 2018 в 23:23
поделиться

Добавление

  target='_top'

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

22
ответ дан Kevin Vella 24 August 2018 в 23:23
поделиться

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

1
ответ дан kinghenry14 24 August 2018 в 23:23
поделиться

Это ребята!

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

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

7
ответ дан Konst 24 August 2018 в 23:23
поделиться

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

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

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

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

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

anyorigin.org

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

, тогда есть третий вариант:

http: / /anyorigin.com/

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

1
ответ дан Kyle Baker 24 August 2018 в 23:23
поделиться

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

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);
0
ответ дан mattdlockyer 24 August 2018 в 23:23
поделиться

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

12
ответ дан Mohammad Ali Akbari 24 August 2018 в 23:23
поделиться

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

Источники

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

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

123
ответ дан Q Studio 24 August 2018 в 23:23
поделиться

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

echo "<script>window.top.location = 'https://apps.facebook.com/yourappnamespace/';</script>";
2
ответ дан Ram Sharma 24 August 2018 в 23:23
поделиться

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


?>

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

1
ответ дан swatkat7 24 August 2018 в 23:23
поделиться

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

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

  1. Запросить URL-адрес iframe из YQL (функция loadURL),
  2. Получить данные HTML из YQL (функция getData),
  3. Добавить загружаемые ссылки <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);
42
ответ дан Sz. 24 August 2018 в 23:23
поделиться

В Chrome есть плагин для этого заголовка (для личного использования):

https://chrome.google.com/webstore/detail/ignore-x- каркасно-заголовки / gleekbfjekiniecknbkamfmkohkpodhe / обзоры

18
ответ дан user 24 August 2018 в 23:23
поделиться

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

156
ответ дан Wil 24 August 2018 в 23:23
поделиться

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

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

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

0
ответ дан Zulqurnain abbas 24 August 2018 в 23:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: