12

我的配置代码

require 'sinatra'

#set :environment, :production
enable :sessions
enable :logging
set run: true

case
  when production?
    set port: 8081
  when development?
    require 'sinatra/reloader'
    require 'better_errors'
    use BetterErrors::Middleware
    BetterErrors.application_root = __dir__
end

use Rack::Session::Cookie, key: 'N&wedhSDF',
    domain: "localhost",
    path: '/',
    expire_after: 14400,
    secret: '*&(^B234'

get '/' do
  erb :hello
end

它仍然显示警告:

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.

但它没有出现在生产中

问题是,为什么即使 Rack::Session::Cookie 已经设置,它仍然显示警告?

4

1 回答 1

36

你同时使用

enable :sessions

使得 Sinatra 设置基于 cookie 的会话,并且

use Rack::Session::Cookie, ...

这还会向您的应用程序添加会话,因此您最终会在中间件堆栈中获得两个实例。Rack::Session::Cookie

警告是由 Sinatra 包含的会话中间件生成的。默认情况下,Sinatra在开发环境中运行时不会创建会话机密(至少在经典模式下,它会为模块化应用程序创建),因此 Rack 在开发中生成警告。

您应该只需要启用会话的两种方式中的一种,同时使用两种方式可能会导致它们以意想不到的方式进行交互。

session_secret为避免警告,您可以使用以下选项为 Sinatra 会话显式设置密码:

enable :sessions
set :session_secret, '*&(^B234'

启用会话时,您还可以将选项哈希作为参数传递。而不是enable :sessions,请执行以下操作:

set :sessions, key: 'N&wedhSDF',
  domain: "localhost",
  path: '/',
  expire_after: 14400,
  secret: '*&(^B234'
于 2013-08-04T21:17:30.797 回答