如何让Sinatra避免添加X-Frame-Options标题?
我正在使用Sinatra返回一些IFRAME内容,我想允许跨域src。 不幸的是,Sinatra会自动为我的回复添加一个X-Frame-Options标题。 我该如何解决这个问题?
Sinatra使用Rack :: Protection ,特别是frame_options
选项,这就是设置X-Frame-Options
标题。
您可以configuration使用哪些保护 。 Sinatra在默认情况下将其中的大部分开启,(有些仅在您使用会话时启用,而Rack :: Protection本身默认情况下不会启用某些function)。
为了防止发送X-Frame-Options
头,你需要像这样禁用frame_options
:
set :protection, :except => :frame_options
另一个解决scheme,我最终在生产中,涉及猴子补丁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应用程序。 我最终添加了一个afterfilter来修改X-Frame-Options
标题,以允许应用程序被Facebook框起来。
after do headers({ 'X-Frame-Options' => 'ALLOW-FROM apps.facebook.com' }) end
使用Sinatra-1.3.3“set:protection,:except =>:frame_options”答案不适用于我
我必须破解一个解决scheme; 我把这mutha在我的config.ru文件。 Obvs你可以改变标题是任何你想要的。
config.ru
class Rack::Protection::FrameOptions def header @header ||= {} end end
我想我find了一个很好的方法来处理这个问题,但会欢迎反馈意见
我们的目标是为了保持所有的机架保护优势而禁用X-Frame-Options。
app.get'/hello_world' do headers({ 'X-Frame-Options' => '' }) "HELLO WORLD" end
我相信这是一个不错的select,因为它似乎阻止机架保护在这条路线上添加SAMEORIGIN标头
实际上,@matt给出的解决scheme仍然在使用Sinatra v1.4.5。
是的,Sinatra使用Rack :: Protection并根据configuration攻击保护
你可以完全禁用保护(这是不推荐的):
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/'