实施安全“记住我”的最佳实践

时间:2010-04-07 18:35:40

标签: asp.net security

有时,我遇到某些不提供身份验证功能的Web开发框架,例如在身份验证ASP.NET中。

我想知道在通过手工编码实现“记住我”登录功能时需要考虑哪些安全措施?

以下是我经常做的事情:

  1. 将用户名存储在cookie中。用户名未加密。

  2. 将密钥存储在cookie中。使用基于用户名的单向函数生成秘密密钥。服务器将根据用户名验证密钥,以确保不更改此用户名。

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

  4. 我错过了其他任何可能导致安全漏洞的事情?

1 个答案:

答案 0 :(得分:17)

Cookie应该始终是一个到期的随机值。在某些情况下,您可以将状态存储为cookie值,而不是一个安全的危险,例如用户的首选语言,但应尽可能避免这种情况。转动HttpOnlyCookies是一个好主意。

OWASP top 10 for 2010中阅读A3:“身份验证和会话管理中断”。本节中的一个重点是https 必须用于整个会话。如果会话持续很长时间,那么这一点就更为重要。

另请注意,“记住我”会创建一个大窗口,攻击者可以在该窗口中“骑行”。这给攻击者一个很长的时间(几个月?),他可以在其中进行CSRF攻击。即使您拥有CSRF保护,攻击者仍可以使用XSS和XmlHttpRequest进行会话(HttpOnlyCookies将阻止完全劫持)。 “记住我”使其他威胁如xss,csrf,嗅探更严重。只要这些漏洞得到解决,那么你就不应该对现实世界的黑客有任何问题。

实现“记住我”功能的最简单(和安全)方法是修改web.config文件的会话超时:

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

将超时设置为高,可能是一个月左右。如果未选中“记住我”复选框,则存储更正常超时的会话变量(如24小时)。检查每个请求的头文件中的此会话变量。如果选中该复选框,则正常操作并让asp.net处理它。

如果会话没有过期,那么暴力会更容易。这些值很大,但允许黑客花费数年时间尝试猜测会话ID是一个漏洞。