【问题标题】:Sinatra/Thin: CSRF Warning on CORS xhr preflight requestSinatra/Thin:关于 CORS xhr 预检请求的 CSRF 警告
【发布时间】:2013-08-18 09:15:46
【问题描述】:

我编写了一个服务器来处理跨站点 JSON 请求。这是一个旨在由 ajax 调用的 API。我得到了它的工作,但我仍然收到一些奇怪的警告。

由于某些 API 调用是 POSTS,因此有一个预检 OPTIONS 请求会触发此警告(稀薄输出):

127.0.0.1 - - [15/Aug/2013 22:24:20] "OPTIONS /login HTTP/1.1" 200 - 0.0080
W, [2013-08-15T22:24:20.124254 #3236]  WARN -- : attack prevented by Rack::Prote
ction::HttpOrigin

这是导致此问题的请求的预检标头:

OPTIONS /login HTTP/1.1
Host: localhost:3000
Connection: keep-alive
Access-Control-Request-Method: POST
Origin: http://localhost:4567
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36
Access-Control-Request-Headers: origin, content-type
Accept: */*
Referer: http://localhost:4567/index.html
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8

另外,我想知道我收到了这个警告:

SECURITY WARNING: No secret option provided to Rack::Session::Cookie.
This poses a security threat. It is strongly recommended that you
provide a secret to prevent exploits that may be possible from crafted
cookies. This will not be supported in future versions of Rack, and
future versions will even invalidate your existing user cookies.

这是带有应该允许CORS xhr的标头的服务器代码:

enable :sessions

before do

  headers['Access-Control-Allow-Origin'] = 'http://localhost:4567'
  headers['Access-Control-Allow-Headers'] = 'origin, content-type, accept'
  headers['Access-Control-Allow-Credentials'] = 'true'

  if request.request_method == 'OPTIONS'
    headers["Access-Control-Allow-Methods"] = "POST, GET"
    halt 200
  end
end

【问题讨论】:

    标签: xmlhttprequest sinatra cors thin


    【解决方案1】:

    这实际上是两个相关的问题,我会一次解决一个。

    1. 根据this SO question,您似乎需要向 Sinatra 提供源白名单。本质上,它试图做的是保护您免受Cross Site Scripting Attacks 的伤害,这可能会伤害您的用户。但是,在某些情况下,您确实希望允许发生跨站点脚本。为此,您可以执行以下操作:

      set :protection, :origin_whitelist => ['http://web.example.com']
      

      标头仅适用于用户的浏览器,但 Rack 也需要权限。两道防线。 有关更多信息,请参阅documentation for Rack::Protection(这是 Sinatra 在这里使用的)。

    2. “秘密选项”错误是指 Rack::Session 上的设置。当你使用 Rack::Session 功能时,你可以像这样在秘密中传递它:

      use Rack::Session::Cookie, :key => 'rack.session',
                                 :domain => 'foo.com',
                                 :path => '/',
                                 :expire_after => 2592000,
                                 :secret => 'change_me'
      

      执行上述操作,而不是简单的enable :sessions。 您也可以找到documentation for Rack::Session here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-25
      • 1970-01-01
      • 2011-07-29
      • 2013-12-24
      • 1970-01-01
      • 2021-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多