2011-02-25 30 views
2

例如,Rails的寧靜身份驗證使用在Ruby on Rails中,使用User.find_by_id(session [:user_id])來標識用戶有多安全?

User.find_by_id(session[:user_id]) 

查找用戶的第一次嘗試。所以

  1. 如果會話通過使用cookies只存儲(這不就是隻用cookie的存儲會話信息的Rails的選擇嗎?),則不能使用用戶ID用戶12345 改變他cookie的值從12345到12346,假裝是另一個用戶?

一個側面說明

I.如果會話是由SESSION_ID作爲一個cookie,並擡頭在數據庫會話信息,則不能在另一個人竊取cookie並假裝成爲那個用戶? (通過攔截互聯網流量竊取cookie)

II。或者,由於第三種選擇是使用cookie auth_token來檢查字段remember_token的用戶表,所以另一個人是否可以盜取 此auth_token cookie並假裝爲該用戶?

回答

3

Cookie安全性,會話劫持等等都覆蓋在Ruby on Rails Security Guide.這是一個必讀。

+0

這是一個很好的指導 – 2011-02-25 00:35:35

+0

但你有一個簡短的回答這個問題? – 2011-02-25 02:24:45

0

這不會發生,因爲會話只是引用存儲在服務器上的cookie。唯一存儲在用戶瀏覽器中的是用於從服務器獲取會話的id。因此,除非他們能夠獲得會話的加密,否則用戶將無法系統地猜測出我之前解釋過的id。

更新

改變默認的會話存儲在服務器上,而不是在cookie

+1

Rails中的默認行爲是將整個會話存儲在cookie中。您可以選擇將其存儲在服務器上。 – jdl 2011-02-25 00:12:34

+0

有用的知識,我需要通過那些文檔 – s84 2011-02-25 00:18:49

+0

,但即使如此,Cookie生成Rails應用程序時生成的密鑰加密,AFAIK – Gareth 2011-02-25 00:27:34

1

從JDL的回答,還有一些段落有:

客戶端所看到的一切你存儲在會話中,因爲它以明文形式存儲(實際上是Base64編碼的,因此不加密)。所以,當然,你不想在這裏存儲任何祕密。爲了防止會話哈希篡改,摘要會根據服務器端祕密的會話進行計算並插入cookie的末尾。

這意味着此存儲的安全性取決於此祕密(以及關於摘要算法,該算法缺省爲SHA512,但尚未受到影響)。所以不要使用一個簡單的祕密,即一個詞典中的一個詞,或者一個短於30個字符的詞。把祕密在你的environment.rb:

config.action_dispatch.session = { 
    :key => '_app_session', 
    :secret => '0x0dkfj3927dkc7djdh36rkckdfzsg...' 
} 

注:我不知道這是config.action_dispatch.sessionconfig.action_controller.session,或者Rails 3.0.1提示:棄用警告:config.action_controller.session已被棄用。請改用Rails.application.config.session_store

+0

我正要將此添加到我的答案中。但是你不會談論違約。 – s84 2011-02-25 04:23:32