Я использую Sinatra для возврата некоторого содержимого IFRAME, и я хотел бы разрешить междоменное src. К сожалению, Sinatra автоматически добавляет заголовок X-Frame-Options к моему ответу. Как отключить это?
Как заставить Sinatra воздерживаться от добавления заголовка X-Frame-Options?
Ответ 1
Sinatra использует Rack:: Protection, в частности параметр frame_options
, который является тем, что устанавливает заголовок X-Frame-Options
.
Вы можете настроить, какие защиты используются. Sinatra по умолчанию включает большинство из них (некоторые из них включены только в том случае, если вы также используете сеансы, а сама Rack:: Protection по умолчанию не включает некоторые из них).
Чтобы предотвратить отправку заголовка X-Frame-Options
, вам необходимо отключить frame_options
следующим образом:
set :protection, :except => :frame_options
Ответ 2
Другое решение, и тот, с которым я закончил работу, включает в себя обезглавливание Rack::Protection::FrameOptions
:
# This monkeypatch is needed to ensure the X-Frame-Options header is
# never set by rack-protection.
module Rack
module Protection
class FrameOptions < Base
def call(env)
status, headers, body = @app.call(env)
[status, headers, body]
end
end
end
end
Ответ 3
Ни один из представленных здесь вариантов не работал для моего приложения sinatra. Я закончил тем, что добавил фильтр after, чтобы изменить заголовок X-Frame-Options
, чтобы приложение могло быть обрамлено Facebook.
after do
headers({ 'X-Frame-Options' => 'ALLOW-FROM apps.facebook.com' })
end
Ответ 4
Ответ "set: protection,: except = > : frame_options" не работал у меня, используя Sinatra-1.3.3
Мне пришлось взломать решение; Я поместил эту мутху в свой файл config.ru. Obvs вы можете изменить заголовок, чтобы быть тем, что вы хотите.
<я > config.ru
class Rack::Protection::FrameOptions
def header
@header ||= {}
end
end
Ответ 5
Я думаю, что нашел хороший способ справиться с этим, но приветствовал бы обратную связь
Цель состоит в том, чтобы отключить X-Frame-Options только для одного маршрута, чтобы сохранить все преимущества защиты стойки:
app.get'/hello_world' do
headers({ 'X-Frame-Options' => '' })
"HELLO WORLD"
end
Я считаю, что это хороший вариант, поскольку, похоже, он предотвращает добавление заголовка SAMEORIGIN на этом маршруте.
Ответ 6
На самом деле решение, данное @matt, все еще работает с Sinatra v1.4.5.
Да, Sinatra использует Rack:: Protection и согласно Конфигурирование защита от атак
вы можете вообще отключить защиту (что не рекомендуется):
disable :protection
или отключить только frame_options:
set :protection, :except => :frame_options
Кроме того, если ваша проблема не из-за X-Frame-Options, она может быть Access-Control-Allow-Origin, то то, что вам нужно do - добавить строку ниже к вашему маршруту перед оператором return:
response['Access-Control-Allow-Origin'] = 'http://www.example.com/'