Sinatraを使用していくつかのIFRAMEコンテンツを返していますが、クロスドメインsrcを許可したいと思います。残念ながら、Sinatraは自動的にX-Frame-Optionsヘッダーを応答に追加しています。どうすればオフにできますか?
Sinatraは Rack :: Protection 、特にframe_options
ヘッダーを設定しているX-Frame-Options
オプションを使用します。
使用する保護を構成する 。 Sinatraはそれらのほとんどをデフォルトでオンにします(一部はセッションも使用している場合にのみ有効になり、Rack :: Protection自体はデフォルトで一部を有効にしません)。
X-Frame-Options
ヘッダーの送信を防ぐには、次のようにframe_options
を無効にする必要があります。
set :protection, :except => :frame_options
別の解決策、そして私が本番環境で最終的に得た解決策は、モンキーパッチを適用することです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
ここに示されているオプションはどちらも、私のsinatraアプリでは機能しませんでした。結局、アフターフィルターを追加してX-Frame-Options
ヘッダーを変更し、Facebookがアプリをフレームインできるようにしました。
after do
headers({ 'X-Frame-Options' => 'ALLOW-FROM apps.facebook.com' })
end
私はこれを処理する良い方法を見つけたと思いますが、フィードバックを歓迎します
目標は、1つのルートに対してのみX-Frame-Optionsを無効にして、ラック保護のすべての利点を維持することです。
app.get'/hello_world' do
headers({ 'X-Frame-Options' => '' })
"HELLO WORLD"
end
ラック保護がこの1つのルートにSAMEORIGINヘッダーを追加するのを妨げているように見えるので、これは良いオプションだと思います
Sinatra-1.3.3を使用すると、「set:protection、:except =>:frame_options」の回答が機能しませんでした。
私は解決策をハックしなければなりませんでした。このmuthaをconfig.ruファイルに入れました。もちろん、ヘッダーは好きなように変更できます。
config.ru
class Rack::Protection::FrameOptions
def header
@header ||= {}
end
end
実際、@ 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/'