Преодоление «Отображение запрещено X-Frame-Options» - PullRequest
408 голосов
/ 12 июля 2011

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

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

Ответы [ 26 ]

5 голосов
/ 20 февраля 2018

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

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

5 голосов
/ 14 июня 2017

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

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

4 голосов
/ 10 марта 2013

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

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

$wgEditPageFrameOptions = "SAMEORIGIN"; 

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

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

3 голосов
/ 19 марта 2012

FWIW:

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

3 голосов
/ 08 декабря 2016

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

  • Перейдите в каталог conf Tomcat, отредактируйте файл 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 голосов
/ 03 августа 2013

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

Gemfile:

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

конфиг / facebook.yml

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

конфиг / application.rb

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

конфиг / Инициализаторы / 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


&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.
  • Файл драгоценного камня (который является ключевым !!!) взят из: слайдов, которые я выучил ...
  • Этот вопрос стека имел весь угол Xframe, так что вы получите пустое место, если Вы не помещаете этот заголовок в контроллер приложения.
  • И мой человек @rafmagana написал это руководство по герои , которое теперь вы можете принять за рельсы с этим ответом и за плечи великанов, с которыми вы ходите.
2 голосов
/ 21 февраля 2014

target = '_ parent'

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

1 голос
/ 05 августа 2015

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

Header always set X-Frame-Options DENY

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

Header always set X-Frame-Options SAMEORIGIN

1 голос
/ 03 июня 2014

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

1 голос
/ 19 декабря 2013

Я не уверен, насколько это актуально, но я нашел обходной путь для этого.На моем сайте я хотел отобразить ссылку в модальном окне, содержащем iframe, который загружает URL.

То, что я сделал, я связал событие нажатия ссылки с этой функцией 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";
}


?>

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

...