2013-06-28 37 views
4

我正在學習Sinatra框架&開發登錄系統。我遇到了兩種使用cookie的方法。使用Sinatra會話和Rack :: Session :: EncryptedCookie的cookie內容的差異

一個簡單的屈內置方式:

enable :sessions 
set :session_secret, 'random-key' 

這種方法會產生以下的cookie內容而登錄。(用於session.inspect獲得輸出):

{"session_id"=>"6be0b9a31831604ba51114d265ba952482e0b2da6ced6c54e15ebe7f212858ca", 
"tracking"=>{"HTTP_USER_AGENT"=>"b8c1e8f89eeaea0b825bed0d811f0c7678e98c74", 
"HTTP_ACCEPT_ENCODING"=>"a0bfc876d68fe7aea700da5ea8925abac6f2f794", 
"HTTP_ACCEPT_LANGUAGE"=>"dd065ed263c67d799f943ab6c39b55c5e008cbb5"}, 
"csrf"=>"b480324f510e4f391d15cee8236a8fb74a5aaa5ce2f9ad38e4dbb025a823b16e",  
"name"=>"john"} 

另一種方法是使用一個加密的Cookie:

require 'sinatra' 
require 'encrypted_cookie' 

use Rack::Session::EncryptedCookie, :secret => "random-key" 

但是這種方法產生了以下cookie con在登錄帳篷(使用session.inspect這裏太):

{:name=>"john"} 

爲什麼enable :sessions與所有的信息&建立這樣一個大餅乾爲什麼需要它(特別是HTTP _...部分?)因爲Rack::Session::EncryptedCookie不生成任何它。

您是否認爲使用enable :sessions應該是首選的,因爲它具有csrf標記&會話ID?或者你認爲Rack::Session::EncryptedCookie已經足夠,因爲它被加密了嗎?

我有以下安裝寶石的版本:

encrypted_cookie (0.0.4) 
rack (1.5.2) 
rack_csrf (2.4.0) 
sinatra (1.4.3) 
thin (1.5.1) 

請告訴我,如果你需要更多信息...

回答

0

因爲Rack::Session::EncryptedCookie要求你的祕密是至少16位長。在自述中,他們建議使用OpenSSL生成的祕密,就像這樣:

ruby -ropenssl -e "puts OpenSSL::Random.random_bytes(16).inspect" 

如果你打開你檢查,你會看到一個名爲「rack.session」餅乾,以及它的內容混淆。

+0

是的。我知道 :)。但我的問題是,你會更喜歡'enable:sessions',因爲它正在生成會話id&csrf標記和所有額外的東西?或者你更喜歡'Rack :: Session :: EncryptedCookie',因爲它的加密和不需要這些添加? – Rahul

+0

您是否在使用其他中間件?執行'enable:sessions'然後檢查會話會給我一個類似於'Rack :: Session :: EncryptedCookie'的輸出。就我個人而言,我使用'Rack :: Session :: Cookie'作爲中間件,並設置密鑰(從環境變量中加載)。 –

+0

嗯。在使用'enable:sessions'方法時,我沒有使用任何其他中間件。順便說一句,我編輯的問題,包括所需的寶石版本。與你相比,我可能有不同版本的寶石。任何線索? – Rahul

1

因爲Sinatra將在啓用:sessions時使用rack-protection中間件。它使cookie變得更大但更安全。

相關片段:

def setup_default_middleware(builder) 
    builder.use ExtendedRack 
    builder.use ShowExceptions  if show_exceptions? 
    builder.use Rack::MethodOverride if method_override? 
    builder.use Rack::Head 
    setup_logging builder 
    setup_sessions builder 
    setup_protection builder 
end 

def setup_sessions(builder) 
    return unless sessions? 
    options = {} 
    options[:secret] = session_secret if session_secret? 
    options.merge! sessions.to_hash if sessions.respond_to? :to_hash 
    builder.use session_store, options 
end 

def setup_protection(builder) 
    return unless protection? 
    options = Hash === protection ? protection.dup : {} 
    options = { 
    img_src: "'self' data:", 
    font_src: "'self'" 
    }.merge options 

    protect_session = options.fetch(:session) { sessions? } 
    options[:without_session] = !protect_session 

    options[:reaction] ||= :drop_session 

    builder.use Rack::Protection, options 
end 
  • sessions?返回true,如果啓用:會話
  • session_storeRack::Session::Cookie默認

之間的差異Rack::Session::EncryptedCookie

也就是說,如果你想使用Rack::Session::EncryptedCookierack-production,它可以很容易地做到:

enable :sessions 
set :session_store, Rack::Session::EncryptedCookie 

僅供參考,因爲encrypted_cookie是缺少某些功能(祕密旋轉,自定義序列等),不再享有維護,我用another one來取代它。

希望它有幫助。

0

據我所知,在Sinatra中使用Rack :: Session :: Cookie並將session_secret寫入環境變量時,已創建的會話在部署項目後不會銷燬。我認爲這是單頁應用程序的風險。

相關問題