制作安全的登录cookie

时间:2011-03-05 03:56:04

标签: asp.net security authentication cookies

我最近读过Jeff的一个articles about XSS,它让我想到如何更好地保护我家庭认证系统中的登录cookie。

基本上我现在所做的就是这个(注意,一切都是可配置的,目前设置为true):

     protected static string ComputeLoginHash(string passwordhash){
        StringBuilder sb=new StringBuilder();
        sb.Append(passwordhash);
        if(CookieUseIP){
            sb.Append(HttpContext.Current.Request.UserHostAddress);
        }
        if(CookieUseBase){
            sb.Append(HttpContext.Current.Request.MapPath("/"));
        }
        if(CookieUseBrowserInfo){
            sb.Append(HttpContext.Current.Request.UserAgent);
        }
        sb.Append(SiteName);
        return ComputeHash(sb.ToString());
    }

(请注意,passwordhash由密码,唯一盐和用户名组成)。

好的,我所做的一件有问题的事情就是使用UserAgent字符串。这样做有害吗?或者是在正常操作下更改其UserAgent字符串的浏览器(如同,没有更新)?我的目标基本上是针对攻击者是否获得登录cookie,因为他们无法对其进行任何操作。这有助于实现我的目标,还是对用户来说过于繁琐?目前,我在cookie纯文本中存储的唯一信息是用户名。

1 个答案:

答案 0 :(得分:6)

首先,您不应该编写自己的会话处理程序。你正在重新发明轮子,它将不那么安全。

如果ComputeLoginHash()正在生成Cookie值,那么您手上就会出现大问题。攻击者可以从数据库中获取用户名/密码哈希,然后通过将其传递给哈希函数来构建cookie值。这将允许攻击者登录而无需破解密码。实际上,您完全取消了散列密码提供的保护。

Cookie值必须始终为cryptographic nonce,此值必须过期(少于一天是好的。)。为了增加安全性,启用http-only cookies有助于阻止xss。同时将sts-header设置为强制执行https,然后再处理OWASP A9。另外,不要忘记session riding。检查用户代理也绝对没有意义,因为这是一个攻击者控制的变量。