我正在使用 Sinatra 返回一些 IFRAME 内容,并且我想允许跨域 src。不幸的是,Sinatra 会自动在我的回复中添加一个 X-Frame-Options 标头。我该如何关闭它?
6 回答
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
我想我找到了处理这个问题的好方法,但欢迎提供反馈
目标是仅针对一条路线禁用 X-Frame-Options 以保持所有机架保护优势:
app.get'/hello_world' do
headers({ 'X-Frame-Options' => '' })
"HELLO WORLD"
end
我相信这是一个不错的选择,因为它似乎可以防止机架保护在这条路线上添加 SAMEORIGIN 标头
使用 Sinatra-1.3.3 的“set :protection, :except => :frame_options”答案对我不起作用
我不得不破解一个解决方案;我把这个 mutha 放在我的 config.ru 文件中。Obvs 您可以将标题更改为您想要的任何内容。
配置.ru
class Rack::Protection::FrameOptions
def header
@header ||= {}
end
end
实际上,@matt 给出的解决方案仍然适用于 Sinatra v1.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/'