Подолання "Дисплей заборонений параметрами X-Frame"


419

Я пишу крихітну веб-сторінку, метою якої є створення декількох інших сторінок, просто їх об'єднання в одне вікно браузера для зручності перегляду. Кілька сторінок, які я намагаюся обрамляти, забороняють оформляти кадр і кидати "Відмовлено у відображенні документа, оскільки показ заборонений X-Frame-Options". помилка в Chrome. Я розумію, що це обмеження безпеки (з поважних причин), і не маю доступу для його зміни.

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


117
Якщо вони ваші сторінки, то зніміть обмежувач кадру. В іншому випадку, поважайте побажання автора сторінки та НЕ РАМУЙТЕ ЇХ.
Марк Б

Якщо ви отримуєте цю помилку в додатку Facebook і використовуєте дзвінки AJAX, я десь прочитав, що Facebook дуже любить використовувати # теги для його контакту з Ajax, тому спробуйте змінити посилання, працюючи для мене.
eric.itzhak

28
@MarcB Chrome та Firefox етично обрамляють веб-сайти, що не належать до власного хромату інтерфейсу користувача. Ці програми також дозволяють розслаблювати політику одного походження для своїх власників, FWIW. Як сказав Garen-Checkly, "я пишу крихітну веб-сторінку, метою якої є обрамлення декількох інших сторінок, просто об'єднання їх у єдине вікно браузера для зручності перегляду". Це в основному розширює веб-браузер і було б абсолютно етично. Заявлений намір не відрізняється від написання bash-скрипту для відкриття та упорядкування вікон браузера.
Самуель Даніельсон

1
Перевірте Surfly . Він може робити саме те, що потрібно.
muodov

1
@MarcB Це не корисно. ОП може не піклуватися про побажання автора сторінки.
flarn2006

Відповіді:


211

У мене була подібна проблема, коли я намагався відобразити вміст із власного сайту в рамці iframe (як діалогове вікно стилю лайтбоксу з Colorbox ), і де у нас на загальному сервері заголовок "X-Frame-Options SAMEORIGIN" на вихідний сервер, що запобігає завантаженню на наш тестовий сервер.

Це, здається, ніде не задокументовано, але якщо ви можете редагувати сторінки, які ви намагаєтесь отримати кадр (наприклад, це ваші власні сторінки), просто надіславши інший заголовок X-Frame-Options з будь-яким рядком і зовсім вимкнеться. команди SAMEORIGIN або DENY.

напр. для PHP, ставлячи

<?php
    header('X-Frame-Options: GOFORIT'); 
?>

у верхній частині сторінки веб-переглядачі змусять браузери поєднувати два, що призводить до заголовка

X-Frame-Options SAMEORIGIN, GOFORIT

... і дозволяє завантажувати сторінку в iframe. Це, здається, працює, коли початкова команда SAMEORIGIN була встановлена ​​на рівні сервера, і ви хочете змінити її в регістрі сторінок за сторінкою.

Все найкраще!


3
У мене був кадр навколо веб-сайту. На своєму веб-сайті я переспрямовую в Instagram для OAUTH. Оскільки Instagram надсилає, X-Frame-Options: SAMEORIGINнемає ніякого способу зробити це всередині кадру. Ви повинні використовувати спливаюче вікно.
Стів Таубер

16
З PHP, мабуть, краще використовувати нову header_removeфункцію, за умови, що у вас є її доступність (> = 5.3.0).
кішка

11
Або ви можете редагувати .htaccess, якщо ви хочете видалити параметри X-Frame з цілого каталогу. Просто додайте рядок:Header always unset X-Frame-Options
Джей

4
@cawecoy: Ну так, вся справа в тому, що він недійсний. Він покладається на те, що веб-переглядачі ігнорують недійсний заголовок та "не вдається відкрити". GOFORIT(або інший випадковий довільний недійсний маркер) навмисно порушує захід безпеки, застосований сервером; якщо у вас є контроль над сервером самостійно (що ви повинні зробити для будь-якої реальної публічної служби), то правильна річ - це просто встановити сервер не встановлювати заголовка в першу чергу.
bobince

31
Схоже, це більше не працює в Chrome. Недійсні значення призводять до значення DENY за замовчуванням.
jamesfm

159

Якщо ви отримуєте цю помилку для відео 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


14
О прогрес ... Я хотів би, щоб вони просто перенаправили нас на вбудовану сторінку замість того, щоб викликати помилку, щоб видалити, і змусити мене переписати свої сценарії!
joeytwiddle

122

Якщо ви отримуєте цю помилку під час спроби вбудувати карту Google у iframe, вам потрібно додати &output=embedдо вихідного посилання.


120
Це справедливо лише для вбудовування карт Google в рамку, а не загального "рішення".
Бенджамін Вольвенд

17
Мені потрібно було вставити карту google у лайтбокс, тому це "рішення" було ідеальним
yitwail

5
Якщо ви намагаєтеся зробити це з веб-наміром Twitter, забудьте про це. Щойно втратили цілий день, пробуючи різні плагіни для лайтбоксу, лише щоб дізнатися це "Хоча ви можете надавати посилання на наміри в межах IFRAME та віджетів, результати сторінки не можуть бути завантажені в IFRAME". Джерело: веб-сайт Twitter.
Губатрон

6
Це не спрацьовує, якщо ви намагаєтесь завантажити програму iframe src після завантаження іншої сторінки, навіть якщо ви додасте&output=embed
pathfinder

1
@pathfinder Це спрацювало для мене, коли у мене виникли проблеми із завантаженням iframe src після завантаження сторінки
David Sykes

61

ОНОВЛЕННЯ 2019: Ви можете обійти X-Frame-Optionsза <iframe>допомогою лише JavaScript на стороні клієнта та мій веб-компонент X-Frame-Bypass . Ось демонстрація: Hacker News in anX-Frame-Bypass . (Випробувано в Chrome і Firefox.)


3
Це цікаве рішення. Добре працює у FF / Chrome / Opera, але не працює в IE / Edge. Хто знає щось, що буде?
Колекціонер

7
Це вже не працює. Він дає "Відмовлено у відображенні" news.ycombinator.com "у кадрі, оскільки він встановив" Параметри X-Frame "на" DENY "." як очікувалося
g.pickardou

2
@ g.pickardou Це працює для мене в Google Chrome 46, я можу побачити Hacker News у iframe.
niutech

1
@niutech ця скрипка працює після перезавантаження сторінки в Chrome 64, але коли я перший раз завантажую сторінку, вона не працює. (Спробуйте інкогніто.)
Карл Уолш

1
Дякую, це приголомшливо!
Ендрю Ганс

23

Додавання а

  target='_top'

на моє посилання на вкладці у Facebook вирішили проблему для мене ...


1
У мене була така ж проблема з iframe Paypal, що міститься в іншому iframe. Це працює зараз! Спасибі
Фабріціо Фортіно,

4
Я також додав target = '_ top', але проблема з цим рішенням полягає в тому, що посилання тепер відкривається поза рамкою iframe на новій вкладці без полотна facebook.
sumitkanoje

23

Існує плагін для Chrome, який видаляє цей запис заголовка (лише для особистого використання):

https://chrome.google.com/webstore/detail/ignore-x-frame-headers/gleekbfjekiniecknbkamfmkohkpodhe/reviews


@aup Це, ймовірно, вносить деякі зміни в заголовковій частині веб-сторінки.

Розширення не вносить жодних змін на веб-сторінку, але, здається, ігнорує перевірку заголовка відповіді кадру на рівні браузера
Vignesh Ammasi


13

У мене виникло таке ж питання, коли я спробував вставити настрій настрою 2 в iframe, рішення є Site administration ► Security ► HTTP securityі перевіритиAllow frame embedding


добре зроблено для методу настрою, оскільки інші методи не вдаються / перезаписуються.
ericosg

7

Це рішення хлопці !!

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

Єдине, що працювало для додатків у facebook!


6

Здається, що параметри X-Frame Allow-From https: // ... знецінюються та замінюються (і ігноруються), якщо ви використовуєте політику вмісту-безпеки замість цього використовуєте заголовок .

Ось повна довідка: https://content-security-policy.com/


6

Рішення для завантаження зовнішнього веб-сайту в iFrame навіть жорсткий варіант x-frame встановлений для заборони на зовнішньому веб-сайті.

Якщо ви хочете завантажити інший веб-сайт в iFrame, ви отримаєте Display forbidden by X-Frame-Options” помилку, ви можете реально подолати це, створивши проксі-сервер на скрипті.

The srcАтрибут плаваючого фрейма може мати 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-запит, який, можливо, був звичайним відвідуванням сторінки браузера.

Будьте в курсі: можливо, ви хочете покращити безпеку в цьому сценарії. Тому що хакери можуть почати завантажувати веб-сторінки через ваш проксі-скрипт.


Я робив це кілька тижнів тому, і будь-які відносні URL-адреси, які використовуються на зовнішній сторінці, не функціонують під час використання луни. (Зазвичай CSS та / або JS, тому ви не можете отримати повну функціональність, якщо ви не змінюєте URL-адреси перед тим, як повторюватись.) Якщо я щось не пропустив ...,
ultrageek

Не впевнений, чому це трапляється з вами ... Він повинен працювати як звичайний HTTP-запит, подібно до того, як виконує кінцевий користувач під час відвідування URL-адреси. Таким чином, результат get_file_contents () повинен бути повністю працюючою HTML-сторінкою.
Флоріс

5

Я спробував майже всі пропозиції. Однак єдине, що справді вирішило це питання:

  1. Створіть .htaccessу тій самій папці, де лежить ваш PHP-файл.

  2. Додайте цей рядок до htaccess:

    Header always unset X-Frame-Options

Вбудовування PHP за допомогою iframe з іншого домену має працювати згодом.

Крім того, ви можете додати файл на початку PHP:

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

Що в моєму випадку було не потрібно.


Заголовок завжди знімав параметри X-Frame-параметри в htaccess, зробив для мене трюк
ujwal dhakal

4

У мене була така ж проблема з mediawiki. Це було через те, що сервер відмовив вкладати сторінку в iframe з міркувань безпеки.

Я вирішив це написання

$wgEditPageFrameOptions = "SAMEORIGIN"; 

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

Сподіваюся, це допомагає.


3

FWIW:

У нас була ситуація, коли нам потрібно було вбити наших, iFrameколи з'явився цей код "вимикача". Отже, я використовував PHP, function get_headers($url);щоб перевірити віддалену URL-адресу, перш ніж показувати її в iFrame. Для кращої продуктивності я кешував результати у файл, тому я не встановлював HTTP-з'єднання кожного разу.


3

Я використовував 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

Єдине питання, на яке є купа відповідей. ПОПЕРЕДЖАЙТЕ до керівництва, яке б я хотів, коли я намагався це зробити, щоб він працював о 10:30 вночі в кінцевий день ... FB робить якісь дивні речі з полотняними програмами, і добре, вас попередили. Якщо ви все ще тут і у вас є додаток 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.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для цього додатка:


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.
  • Файл дорогоцінного каміння (який є ключовим !!!) прийшов із: слайд-речей, які я дізнався ...
  • У цьому питанні про стек був весь кут Xframe, тому ви отримаєте порожнє місце, якщо не помістите цей заголовок у контролер програми.
  • А мій чоловік @rafmagana написав цей посібник з героїкою , який тепер можна прийняти за рейки з цією відповіддю та плечима гігантів, в яких ти ходиш.

2

target = '_ батьків'

Використовуючи ідею Кевіна Велла, я спробував додати цей атрибут для формування елементів, створених генератором кнопок PayPal. Для мене працювали, щоб Paypal не відкривався у новому вікні / вкладці браузера.


На жаль, це, здається, не працює і для сафарі.
Wtower

1

Я не впевнений, наскільки це актуально, але я створив обробку для цього. На своєму сайті я хотів відобразити посилання у модальному вікні, яке містило iframe, який завантажує URL-адресу.

Що я зробив, я пов’язав подію натискання посилання на цю функцію javascript. Все це - це зробити запит у файл PHP, який перевіряє заголовки URL-адрес на параметри X-FRAME, перш ніж вирішити, завантажувати 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

Я зіткнувся з цим питанням під час запуску веб-сайту 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
Я закінчив робити це: remove_action( 'admin_init', 'send_frame_options_header',10);щоб обійти цю проблему ...
majick

1

Дивно, що тут ніхто ніколи не згадував Apacheналаштування ( *.confфайли) сервера або .htaccessсам файл як причину цієї помилки. Шукайте через ваші файли .htaccessчи Apacheфайли конфігурації, переконайтесь, що у вас немає наступного параметра DENY:

Header always set X-Frame-Options DENY

Змінивши його SAMEORIGIN, змушує роботу працювати так, як очікувалося:

Header always set X-Frame-Options SAMEORIGIN


це було згадано раніше - див коментар від @Jay на відповідь stackoverflow.com/a/6767901/1875965
Sandra

Я конфігуюю .conf Заголовок файлу завжди встановлює параметри X-Frame SAMEORIGIN!
GeekHades

Але як це стосується питання, де заголовок надходить із іноземних серверів, безпосередньо до клієнта , IOW власний сервер навіть не задіяний? Я щось пропускаю?
Sz.

1

Єдина реальна відповідь, якщо ви не керуєте заголовками у своєму джерелі, який ви хочете у вашому iframe, - це проксі. Запропонуйте серверу діяти як клієнт, отримати джерело, зняти проблемні заголовки, додати CORS, якщо потрібно, а потім пінг власного сервера.

Є ще одна відповідь, яка пояснює, як написати такий проксі. Це не важко, але я був впевнений, що хтось мав це робити раніше. Це було просто важко знайти, чомусь.

Нарешті я знайшов деякі джерела:

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

^ кращий. Якщо вам потрібне рідкісне використання, я думаю, ви можете просто скористатися його програмою heroku. В іншому випадку це код запустити його самостійно на власному сервері. Зверніть увагу, які обмеження є.

whateverorigin.org

^ другий вибір, але досить старий. нібито новіший вибір у python: https://github.com/Eiledon/alloworigin

то є третій вибір:

http://anyorigin.com/

Це, здається, дозволяє трохи скористатися безкоштовним використанням, але додасть вас до загальнодоступного списку ганьби, якщо ви не заплатите та не скористаєтесь певною сумою, яку ви можете зняти, лише якщо сплатите плату ...


0

Не згадується, але може допомогти в деяких випадках:

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

Використовуйте цей рядок, поданий нижче замість header()функції.

echo "<script>window.top.location = 'https://apps.facebook.com/yourappnamespace/';</script>";

0

У мене була ця проблема, і я вирішив її, редагуючи https.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 і перезапустив сервер


-1

Спробуйте це, я не думаю, що хтось запропонував це в темі, це вирішить, як 70% вашої проблеми, для деяких інших сторінок вам доведеться брати лом, у мене є повне рішення, але не для публічного,

ДОДАТИ нижче до вашого рамки

sandbox = "дозволити-сценарії дозволу з однаковим походженням


1
пісочниця знижує привілеї, вона не додає їх. дивіться html5rocks.com/en/tutorials/security/sandboxed-iframes
Кайл Бейкер

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.