0

我编写了一个服务器来处理跨站点 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
4

1 回答 1

1

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

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

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

    标头仅适用于用户的浏览器,但 Rack 也需要权限。两道防线。有关更多信息,请参阅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。您还可以在此处找到 Rack::Session 的文档

于 2013-08-16T10:24:47.380 回答