我最近读过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纯文本中存储的唯一信息是用户名。
答案 0 :(得分:6)
首先,您不应该编写自己的会话处理程序。你正在重新发明轮子,它将不那么安全。
如果ComputeLoginHash()
正在生成Cookie值,那么您手上就会出现大问题。攻击者可以从数据库中获取用户名/密码哈希,然后通过将其传递给哈希函数来构建cookie值。这将允许攻击者登录而无需破解密码。实际上,您完全取消了散列密码提供的保护。
Cookie值必须始终为cryptographic nonce,此值必须过期(少于一天是好的。)。为了增加安全性,启用http-only cookies有助于阻止xss。同时将sts-header设置为强制执行https,然后再处理OWASP A9。另外,不要忘记session riding。检查用户代理也绝对没有意义,因为这是一个攻击者控制的变量。