2013-06-27 36 views
1

我是新來的web應用程序開發&剛剛開始學習Sinatra框架。我目前正在開發一個登錄系統。 這裏是必要的代碼:每個請求都改變Cookie,使用sinatra和Rack :: Session :: EncryptedCookie

require 'sinatra' 
require 'openssl' 
require 'encrypted_cookie' 

configure do 
    use Rack::Session::EncryptedCookie, :secret => "foo-bar-baz", :httponly => true 

然後,我存儲的用戶名在該會議上,如果他/她被授權:

post '/' do 
    if authorize(params[:name], params[:password], params[:csrfkey]) 
    session[:name] = params[:name] 
    end 
end 

的cookie被加密的所有權利。它也記住會話值。

但是在使用Firebug時,我注意到在每次請求(頁面加載,刷新等)時,cookie的內容都會改變&我的意思是完全改變了。 Sinatra似乎在每次請求時都會發送新的cookie。

此前,我曾使用enable :sessions & cookie從未改變過。

所以我的問題是,在會話期間每次請求都改變cookie的內容是否正常?

這是否因加密而發生?

我在網上搜索高&低,但沒有人有這個問題,我想..

+1

是的這是正常的,並且實際上可以防止某些種類的會話劫持攻擊,但我不知道'Rack :: Session :: EncryptedCookie'具體做什麼,所以不能提供詳細的答案。 –

+0

哦,好的。我只是很想知道爲什麼cookie的內容正在改變,即使會話內容根本沒有改變。謝謝您的回覆。 :-) – Rahul

回答

4

source for encrypted_cookie表明,generates different encrypted output every time it is called regardless of the input。有2個原因:

  • 必須知道會話值是最後的請求過程中。它沒有,它所做的只是接受一個輸入,即給定的會話。如果你想繞過這個,只是重寫cookie(我想)你可以,因爲你在Sinatra應用程序中有更多可用的信息。
  • 它更安全。它不會泄漏信息(如果cookie沒有改變,那麼cookie的觀察者在請求期間就不知道任何改變),並且給攻擊者更少的時間嘗試獲得有意義的值。
+0

謝謝你這麼明確的解釋!我會upvote的答案,但沒有足夠的repv現在。 – Rahul

+0

@Rahul沒問題,很高興我能幫上忙。 – iain