【问题标题】:Best Practice to Implement Secure "Remember Me"实施安全“记住我”的最佳实践
【发布时间】:2011-02-05 09:38:24
【问题描述】:

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

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

以下是我通常会做的事情:

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

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

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

还有什么我遗漏的可能导致安全漏洞的吗?

【问题讨论】:

    标签: asp.net security


    【解决方案1】:

    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 是一个漏洞。

    【讨论】:

    • 很好的答案。我唯一要补充的是采取预防措施来防止 XSS 和 CSRF。如果您有长时间的会话,这两个问题都会变得很重要。
    • @Srim 我完全同意你的看法。 (+1)
    猜你喜欢
    • 2015-02-20
    • 2018-07-25
    • 2011-08-23
    • 2011-04-01
    • 2015-06-14
    • 2010-09-28
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    相关资源
    最近更新 更多