web-dev-qa-db-ja.com

SinatraにX-Frame-Optionsヘッダーの追加を控えさせるにはどうすればよいですか?

Sinatraを使用していくつかのIFRAMEコンテンツを返していますが、クロスドメインsrcを許可したいと思います。残念ながら、Sinatraは自動的にX-Frame-Optionsヘッダーを応答に追加しています。どうすればオフにできますか?

35
Bruce

Sinatraは Rack :: Protection 、特にframe_optionsヘッダーを設定しているX-Frame-Optionsオプションを使用します。

使用する保護を構成する 。 Sinatraはそれらのほとんどをデフォルトでオンにします(一部はセッションも使用している場合にのみ有効になり、Rack :: Protection自体はデフォルトで一部を有効にしません)。

X-Frame-Optionsヘッダーの送信を防ぐには、次のようにframe_optionsを無効にする必要があります。

set :protection, :except => :frame_options
80
matt

別の解決策、そして私が本番環境で最終的に得た解決策は、モンキーパッチを適用することです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
4
xentek

ここに示されているオプションはどちらも、私のsinatraアプリでは機能しませんでした。結局、アフターフィルターを追加してX-Frame-Optionsヘッダーを変更し、Facebookがアプリをフレームインできるようにしました。

after do
  headers({ 'X-Frame-Options' => 'ALLOW-FROM apps.facebook.com' })
end
3
xentek

私はこれを処理する良い方法を見つけたと思いますが、フィードバックを歓迎します

目標は、1つのルートに対してのみX-Frame-Optionsを無効にして、ラック保護のすべての利点を維持することです。

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

ラック保護がこの1つのルートにSAMEORIGINヘッダーを追加するのを妨げているように見えるので、これは良いオプションだと思います

3
stujo

Sinatra-1.3.3を使用すると、「set:protection、:except =>:frame_options」の回答が機能しませんでした。

私は解決策をハックしなければなりませんでした。このmuthaをconfig.ruファイルに入れました。もちろん、ヘッダーは好きなように変更できます。

config.ru

class Rack::Protection::FrameOptions
  def header
    @header ||= {}
  end
end
2
ted price

実際、@ mattによって提供されたソリューションは、Sinatrav1.4.5で引き続き機能します。

はい、Sinatraは Rack :: Protection を使用しており、 攻撃保護の構成 に従っています

保護をまったく無効にすることもできます(これはお勧めしません)。

disable :protection

または、frame_optionsのみを無効にします。

set :protection, :except => :frame_options

それ以外に、問題がX-Frame-Optionsによるものでない場合は、Access-Controlである可能性があります。 -Allow-Originの場合、returnステートメントの前にルートに以下の行を追加する必要があります。

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