制作安全的登录cookie

Ear*_*rlz 3 asp.net security authentication cookies

我最近阅读了Jeff 关于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());
    }
Run Code Online (Sandbox Code Playgroud)

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

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

roo*_*ook 6

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

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

Cookie值必须始终为加密nonce,此值必须到期(少于一天是好的.).为了增加安全性,启用仅限http的cookie,这有助于阻止xss.同时设置sts-header以强制执行https,然后依次处理OWASP A9.另外,不要忘记会话骑行.检查用户代理也绝对没有意义,因为这是一个攻击者控制的变量.