2010-04-07 78 views
22

有時,我遇到了某些不提供身份驗證功能的Web開發框架,如身份驗證ASP.NET。實現安全「記住我」的最佳實踐

我想知道在通過手動編碼實現「記住我」登錄功能時需要考慮哪些安全措施?

這裏有事情,我通常做:

  1. 存儲在cookie中的用戶名。用戶名未加密。

  2. 將密鑰存儲在cookie中。使用基於用戶名的單向函數生成密鑰。服務器將根據用戶名驗證密鑰,以確保此用戶名未被更改。

  3. 在Cookie中使用HttpOnly。 http://www.codinghorror.com/blog/2008/08/protecting-your-cookies-httponly.html

還有什麼我錯過了,這可能會導致安全漏洞?

回答

17

Cookie應始終爲過期的隨機值。在某些情況下,您可以將狀態存儲爲Cookie值,並且不會造成安全隱患,例如用戶首選的語言,但應儘可能避免這種情況。打開HttpOnlyCookies,是一個好主意。

閱讀A3:OWASP top 10 for 2010中的「破壞的身份驗證和會話管理」。本節中的一個重點是https 必須用於整個會話。如果會議持續很長時間,那麼這更重要。

另外請記住,「記住我」創建了一個大型窗口,攻擊者可以在該窗口上「騎」會話。這給了攻擊者很長的時間(幾個月?),他可以提供CSRF攻擊。即使你擁有CSRF保護,攻擊者仍然可以使用XSS和XmlHttpRequest進行會話(HttpOnlyCookies將防止完全劫持)。 「記住我」讓其他威脅如xss,csrf,嗅探更嚴重。只要這些漏洞得到解決,那麼你就不應該對真實世界的黑客有問題。

最簡單的(安全)的方法來實現一個「記住我」功能,將修改會話超時你的web.config文件:

<configuration> 
     <system.web> 
      <sessionState timeout="60"/> 
      </sessionState> 
     </system.web> 
    </configuration> 

硒超時的東西高,也許一個月所以。如果未選中「記住我」複選框,則存儲更正常超時的會話變量(如24小時)。在每個請求的頭文件中檢查此會話變量。如果複選框被選中,然後正常行爲,並讓asp.net照顧它。

如果會話沒有過期,那麼暴力就會容易得多。這些值很大,但允許黑客花費數年時間來猜測會話ID是一個漏洞。

+3

很好的答案。我唯一要添加的是採取預防措施來防止XSS和CSRF。如果你有長時間的會話,這兩個問題就變得很重要。 – 2010-04-07 22:17:23

+0

@Srim我完全同意你的看法。 (1) – rook 2010-04-07 22:28:31