2013-08-04 6 views
12

mój kod konfiguracjiSinatra/1.4.3 Zastosowanie Rack :: Session :: Cookie ostrzeżenie

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 

nadal pokazuje ostrzeżenie:

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. 

ale nie pojawi się na produkcji

Pytanie brzmi, dlaczego nadal wyświetla ostrzeżenie, nawet jeśli zestaw Rack :: Session :: Cookie jest już ustawiony?

Odpowiedz

34

Używasz zarówno

enable :sessions 

która makes Sinatra setup cookie based sessions i

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

który dodaje również sesje w Twojej aplikacji, więc możesz skończyć z dwa wystąpień Rack::Session::Cookie w swojej middleware stosie.

Ostrzeżenie jest generowane przez oprogramowanie pośredniczące sesji dołączone przez Sinatrę. Domyślnie Sinatra doesn’t create a session secret when running in the development environment (przynajmniej w klasycznym trybie dla aplikacji modułowych), więc Rack generuje ostrzeżenie w fazie rozwoju.

Powinieneś potrzebować tylko jednego z dwóch sposobów włączania sesji, a użycie dwóch razem może spowodować interakcję w nieoczekiwany sposób.

Aby uniknąć ostrzeżenie, można jawnie ustawić w tajemnicy do sesji Sinatry z opcją session_secret:

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

Można również przekazać hash opcji jako argument podczas włączania sesji.

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

może Pan wyjaśnić, co ustawienie '' session_secret'' robi: zamiast enable :sessions to zrobić? Szukałem odpowiedzi, ale nigdzie jej nie mogę znaleźć. Domyślam się, że używa go jako soli do haszyszu, aby ludzie nie mogli fałszować ciasteczek. – Piccolo

+0

@Piccolo Tak, ma to na celu uniemożliwienie ludziom fałszowania plików cookie, ale jest on używany jako klucz w [HMAC] (https://en.wikipedia.org/wiki/Hash-based_message_authentication_code), a nie jako sól. Sprawdź [kod sesji Rack cookie] (https://github.com/rack/rack/1.6.4/lib/rack/session/cookie.rb), aby uzyskać więcej informacji. – matt

+0

Dziękuję bardzo! Patrzę teraz na to. Czy istnieje jakiś powód, dla którego nie mogę wygenerować nowego tajnego klucza na początku mojej aplikacji? – Piccolo

Powiązane problemy