2009-11-03 209 views
1

我正在寫一個數據庫身份驗證系統,用於我的Web應用程序,它在ASP.NET MVC中聲譽如此。當有人授權時,應該將他的用戶名保存在cookies中。僅僅使用HttpResponse.Cookies來保存其值爲用戶名的cookie是否安全?難道它不可僞造?身份驗證Cookie

只保存用戶名......這是正確和安全的方式嗎?或者我應該保存整個用戶對象(如果這實際上可能)?

謝謝你,對不起我的英文。

回答

5

不,保存用戶名是非常不安全的,因爲它可以很容易僞造。這裏是我的指導原則:

  1. 使用令牌
  2. 哈希它存儲在數據庫中的令牌。
  3. 製作餅乾HttpOnly

令牌可以由CSPRNG生成以確保自動登錄cookie不能僞造。

將數據庫中的令牌散列在數據庫中可防止用戶帳戶被盜用。 (請記住,此時令牌與密碼等效。)

僅限HTTP的Cookie可防止可能潛在竊取cookie的XSS攻擊。

+0

什麼是令牌? – 2009-11-03 16:01:26

+1

令牌是一個隨機生成的數字或一段不可能猜到的文本。 – 2009-11-03 16:02:07

+0

謝謝,但我怎樣才能做一個cookie HttpOnly? – 2009-11-03 16:04:29

0

如果您將用戶名存儲在cookie中,那麼很容易讓某人更改該用戶名。

一個更好的方法是將一個會話ID(您已經生成)存儲在cookie中,並將諸如用戶名之類的東西掛在服務器上。

+0

會話ID和它的用戶名/用戶應該保存在數據庫中嗎? – 2009-11-03 16:03:38

+0

是的 - 所以你會使用會話ID作爲一個表中的關鍵字,其中包含您需要的所有會話相關信息,例如用戶。由於您生成的ID可能以GUID的形式存在,因此某人將無法通過修改Cookie值來僞造其他用戶的會話。 – Andy 2009-11-03 16:08:57

1

不,將用戶名保存在cookie中以標記其授權的用戶不是正確的方式,而且絕對不安全。

將cookie編輯爲別人的用戶名非常容易,瞧!您現在被授權爲該用戶。

相反,您應該在cookie中存儲一些不是特定於用戶的信息,但是特定於用戶會話。您可以從瀏覽器字符串中創建一個值(以某種方式對其進行加密以使其不太明顯),並將值存儲在cookie中和服務器上的會話數據中。當用戶發送下一個請求時,您可以驗證該值來自同一會話和相同的瀏覽器配置。

這當然不是完全安全的,因爲您可以欺騙cookie數據和瀏覽器字符串,但比將用戶名放在cookie中更安全,並且比只依賴會話ID更安全。

要獲得真正安全的身份驗證,您必須使用SSL。

0

使用內置的表單身份驗證框架來處理HTTP傳輸的世界末日,並避免重蹈覆轍。 PS:在某人降級之前,請記住FormsAuthentication!=使用SqlMembershipProvider。