2012-04-27 119 views
4

我注意到很多Rails身份驗證教程將會話ID [:user_id]中的用戶ID存儲起來以記住用戶並對其進行身份驗證。假設應用程序中有某處user_ids被公開暴露(URL,HTML屬性的屬性等),是不是不安全,因爲我可以編輯我的會話cookie以使用其他人的user_id?我在這裏錯過了什麼嗎?使用會話[:user_id]進行Rails身份驗證的安全性

+0

你能鏈接到最近的一個例子嗎?像Devise這樣的解決方案非常標準,聽起來像是從舊版Rails中解脫出來的。 – 2012-04-27 15:59:07

+0

通常會生成某種類型的會話標識,並將其傳遞給Cookie,而不是用戶標識。 – 2012-04-27 16:03:03

+0

下面是一個例子:https://github.com/RailsApps/rails3-mongoid-omniauth – 2012-04-27 17:37:03

回答

8

根據Rails Security Guide: 「爲了防止會話哈希被篡改,摘要是從具有服務器端祕密的會話中計算出來的,並將其插入cookie的末尾。」

所以它看起來像會話可以被認爲是安全的從用戶篡改它(假設我們的服務器端的祕密保持安全)。但是,用戶仍然可以讀取會話散列中的任何內容,因此我們不希望存儲敏感信息。

5

該cookie往往不包含user_id,它包含會話密鑰,它本質上是一個隨機的,無意義的字符串。會話存儲在服務器上(在數據庫中,或memcached,或像redis等nosql存儲),會話保存用戶ID。

因此,會議記錄(僅服務器端)給定用戶可能包含這樣的數據:

key: asoiuoi09u23uo8789289askho2 
user_id: 1234 

以及Cookie(客戶端)持有的會話密鑰,所以餅乾看起來是這樣的:

name: somecookiename 
site: www.yoursite.com 
content: asoiuoi09u23uo8789289askho2 

因此,要訪問其他人的會話,您需要掌握他們的會話密鑰。這絕非不可能(請參閱會話嗅探),但使用https(反過來需要SSL證書)會變得更加困難。

+1

如果你改變會話存儲使用數據庫,這將是真實的,但默認情況下,因爲Rails 2,我相信它是CookieStore。我假設默認的Rails配置。 – 2012-04-27 17:57:17

0

一般來說,我感覺,Cookie會話中的:session_id是無用的,可以省略,因爲它在大多數情況下不會在服務器端進行檢查。或者我錯了?

在大多數情況下:user_id和簽名就足夠了。

相關問題