35

我正在使用 Sinatra 返回一些 IFRAME 内容,并且我想允许跨域 src。不幸的是,Sinatra 会自动在我的回复中添加一个 X-Frame-Options 标头。我该如何关闭它?

4

6 回答 6

80

Sinatra 使用Rack::Protection,特别是frame_options选项,它是设置X-Frame-Options标题的内容。

您可以配置使用哪些保护。默认情况下,Sinatra 会打开其中的大部分功能(有些仅在您还使用会话时才启用,而 Rack::Protection 本身默认不会启用某些功能)。

为了防止发送X-Frame-Options标头,您需要frame_options像这样禁用:

set :protection, :except => :frame_options
于 2011-10-20T19:20:59.080 回答
5

另一种解决方案,也是我最终在生产中使用的解决方案,涉及猴子补丁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
于 2013-10-07T19:18:34.507 回答
3

这里提供的选项都不适用于我的 sinatra 应用程序。我最终添加了一个后过滤器来修改X-Frame-Options标题以允许应用程序被 Facebook 框住。

after do
  headers({ 'X-Frame-Options' => 'ALLOW-FROM apps.facebook.com' })
end
于 2013-08-31T02:08:03.043 回答
3

我想我找到了处理这个问题的好方法,但欢迎提供反馈

目标是仅针对一条路线禁用 X-Frame-Options 以保持所有机架保护优势:

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

我相信这是一个不错的选择,因为它似乎可以防止机架保护在这条路线上添加 SAMEORIGIN 标头

于 2015-10-12T21:28:21.607 回答
2

使用 Sinatra-1.3.3 的“set :protection, :except => :frame_options”答案对我不起作用

我不得不破解一个解决方案;我把这个 mutha 放在我的 config.ru 文件中。Obvs 您可以将标题更改为您想要的任何内容。

配置.ru

class Rack::Protection::FrameOptions
  def header
    @header ||= {}
  end
end
于 2013-01-28T06:03:53.870 回答
1

实际上,@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/'
于 2015-03-19T12:32:37.790 回答