2010-04-07 76 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