2013-08-04 2 views
12

мой код конфигурацииSinatra/1.4.3 Использование Rack :: Session :: Предупреждение о Cookie

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 уже установлен?

ответ

34

Вы используете как

enable :sessions 

какой makes Sinatra setup cookie based sessions и

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

, который также добавляет сеансы для вашего приложения, так что вы в конечном итоге с два экземпляров Rack::Session::Cookie в вашем стеке промежуточного программного обеспечения.

Предупреждение генерируется промежуточным программным обеспечением сеанса, включенным Sinatra. По умолчанию Sinatra doesn’t create a session secret when running in the development environment (в классическом режиме, по крайней мере, для модульных приложений), поэтому Rack генерирует предупреждение в процессе разработки.

Вам может потребоваться только один из двух способов включения сеансов, используя два вместе, чтобы они могли взаимодействовать неожиданными способами.

Чтобы избежать предупреждения, вы можете явно установить секрет для сеанса Синатры с опцией session_secret:

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

Вы также можете передать опции хэш в качестве аргумента при включении сессий. Вместо enable :sessions, сделайте это:

set :sessions, key: 'N&wedhSDF', 
    domain: "localhost", 
    path: '/', 
    expire_after: 14400, 
    secret: '*&(^B234' 
+0

Не могли бы вы объяснить, что такое настройка '' session_secret''? Я искал ответ, но я не могу найти его нигде. Мое лучшее предположение состоит в том, что он использует его как соль для хэша, чтобы люди не могли кузнуть куки. – Piccolo

+0

@ Piccolo Да, это значит, чтобы люди не купили файлы cookie, но они используются как ключ в [HMAC] (https://en.wikipedia.org/wiki/Hash-based_message_authentication_code), а не как соль. За дополнительной информацией обращайтесь к [Сессионный код файла cookie] (https://github.com/rack/rack/blob/1.6.4/lib/rack/session/cookie.rb). – matt

+0

Большое спасибо! Я изучаю это прямо сейчас. Кроме того, есть ли причина, по которой я не могу создать новый секретный ключ в начале моего приложения? – Piccolo

Смежные вопросы