Как заставить Синатру воздержаться от добавления заголовка X-Frame-Options? - PullRequest
34 голосов
/ 20 октября 2011

Я использую Sinatra для возврата содержимого IFRAME и хочу разрешить междоменный src. К сожалению, Синатра автоматически добавляет заголовок X-Frame-Options к моему ответу. Как мне это отключить?

Ответы [ 6 ]

79 голосов
/ 20 октября 2011

Sinatra использует Rack :: Protection , в частности параметр frame_options, который задает заголовок X-Frame-Options.

Вы можете настроить, какие средства защитыб .Sinatra включает большинство из них по умолчанию (некоторые включаются, только если вы также используете сеансы, а Rack :: Protection сам не включает некоторые по умолчанию).

Чтобы предотвратить отправку заголовка X-Frame-Optionsвам нужно отключить frame_options так:

set :protection, :except => :frame_options
4 голосов
/ 07 октября 2013

Другое решение, которое я нашел в производстве, включает в себя исправление обезьян 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 голосов
/ 31 августа 2013

Ни один из представленных здесь вариантов не работал для моего приложения sinatra. В итоге я добавил фильтр after, чтобы изменить заголовок X-Frame-Options, чтобы приложение могло быть вставлено в Facebook.

after do
  headers({ 'X-Frame-Options' => 'ALLOW-FROM apps.facebook.com' })
end
2 голосов
/ 13 октября 2015

Я думаю, что нашел хороший способ справиться с этим, но приветствовал бы обратную связь

Цель - отключить X-Frame-Options только для одного маршрута, чтобы сохранить все преимущества защиты стойки:

    app.get'/hello_world' do
      headers({ 'X-Frame-Options' => '' })
      "HELLO WORLD"
    end

Я полагаю, что это хороший вариант, так как кажется, что защита стойки не добавляет заголовок SAMEORIGIN на этом одном маршруте

2 голосов
/ 28 января 2013

Ответ «set: protection,: кроме =>: frame_options» у меня не работал, используя Sinatra-1.3.3

Мне пришлось взломать решение;Я положил эту муфту в мой файл config.ru.Вы можете изменить заголовок на любой, какой захотите.

config.ru

class Rack::Protection::FrameOptions
  def header
    @header ||= {}
  end
end
1 голос
/ 19 марта 2015

На самом деле, решение, данное @matt, все еще работает с Sinatra v1.4.5.

Да, Синатра использует Rack :: Protection и в соответствии с Настройка защиты от атаки

Вы можете отключить защиту вообще (что не рекомендуется):

disable :protection

или отключить только frame_options:

set :protection, :except => :frame_options

Кроме этого, если ваша проблема не в X-Frame-Options , это может быть Access-Control-Allow-Origin , тогда вам нужно сделать следующее: добавить строку ниже к вашему маршруту до оператора возврата:

response['Access-Control-Allow-Origin'] = 'http://www.example.com/'
...