2013-02-14 46 views
3

我正嘗試使用Omniauth從頭開始進行身份驗證。從頭開始驗證 - cookies被篡改有多安全?

我跟着瑞安貝特的screencast。但在推出實施之前,我想了解一些事情。

在他的截屏,他在application_controller一個helper_method:以上

helper_method :current_user 

private 

def current_user 
    @current_user ||= User.find(session[:user_id]) if session[:user_id] 
end 

代碼,user_id檢查。

我知道sessions are encrypted(並存儲在cookie中)。但是,它們是可讀的,但不能修改。有人用虛假的user_id劫持會話有多難?什麼阻止任何人從零開始創建cookie或通過一些「cookie注入器」方法(如果存在這樣的事情)。

我想了解這些cookie是如何被保護的。

回答

3

會話通常保留在服務器端,通過cookie傳遞給客戶端的唯一東西是會話標識符。無論加密如何,將實際會話數據存儲在該cookie中都是一個主要的安全漏洞。例如如果你很便宜並且使用rot-13「加密」,那麼用戶做數據並設置superuser=1將是微不足道的。

但是使用會話ID,這是不可能的 - cookie中沒有任何東西可以用來擺弄服務器端數據。他們最多可以發回隨機會話ID值,並試圖劫持別人的會話。有了足夠大的ID哈希值,找到另一個會話劫持的機會就會很小。

+0

感謝您的好解釋。所以當創建會話時,會話標識符與服務器端存儲的會話標識符相關聯。會話標識符用於驗證會話是否是真實的。但是,如果有人使用確切的會話標識符和僞造的user_id創建假cookie,該怎麼辦?這不會證實通過? – 2013-02-14 15:12:49

+1

除了這不是Rails默認的行爲方式。您需要切換到ActiveRecord會話存儲以獲取此行爲。 – 2013-02-14 15:14:11

+0

典型的會話cookie基本上只是'nameOfSession = long_ugly_alphanumeric_string'。沒有用戶名/密碼/那裏的數據。 JUST該字符串,用於告訴服務器會話激活時加載哪個會話文件/數據庫記錄/任何內容。這就是整個「猜測」業務進入的地方。如果散列長度足夠短/簡單(例如簡單遞增整數),那麼只需將會話cookie更改爲其他人的會話ID就可以劫持會話。但是如果哈希值足夠複雜,那是不太可能的。 – 2013-02-14 15:15:18

1

您提供的鏈接提供了最佳答案,我想。並且涵蓋了許多更敏感的應用程序,我更關心的更爲隱蔽的攻擊。

在Rails中,提交包含會話數據的僞造或弄亂的cookie將非常困難,因爲cookie由服務器簽名,並且檢查提交的cookie以確保簽名是正確的。更改cookie值需要知道服務器簽署Cookie的密鑰。

最好的做法是在會話中只存儲非常小的位(最好是ID),如果您擔心某人能夠從頭開始創建包含用戶標識的會話cookie,那麼簡單的答案是:don'把user.id放入cookie中。而是爲每個用戶生成一個GUID作爲cookie中的id。通過這種方式,您可以在URL中公開user.id,而不必擔心知道某個用戶的ID會允許攻擊者僞造一個可用的cookie。

+0

很好的解釋 – 2013-02-18 03:44:49