Asp.net 实施“安全”的最佳实践;“记住我”;

Asp.net 实施“安全”的最佳实践;“记住我”;,asp.net,security,Asp.net,Security,有时,我会遇到某些不提供身份验证功能的web开发框架,例如在身份验证ASP.NET中 我想知道,在通过手工编码实现“记住我”登录功能时,需要考虑哪些安全措施 以下是我通常做的事情: 将用户名存储在cookie中。用户名未加密 将密钥存储在cookie中。使用基于用户名的单向函数生成密钥。服务器将根据用户名验证密钥,以确保此用户名未被更改 仅在cookie中使用HttpOnly 我还遗漏了其他可能导致安全漏洞的内容吗?cookie应该始终是一个过期的随机值。在某些情况下,您可以将状态存储为cook

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

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

以下是我通常做的事情:

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

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

  • 仅在cookie中使用HttpOnly


  • 我还遗漏了其他可能导致安全漏洞的内容吗?

    cookie应该始终是一个过期的随机值。在某些情况下,您可以将状态存储为cookie值,而不会造成安全隐患,例如用户的首选语言,但应尽可能避免这种情况。打开HttpOnlyCookies是一个好主意

    请阅读中的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是一个漏洞

    回答得很好。我要补充的唯一一件事是采取预防措施来防止XSS和CSRF。如果您有长期的会话,这两个问题都会变得很重要。@Srim我完全同意您的看法。(+1)