我最近读过杰夫的articles about XSS之一,它让我开始思考如何更好地保护登录的Cookie在我家煮的认证系统。制作一个安全的登录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纯文本中存储的唯一信息是用户名。
我目前没有HTTPS在我的网站,我也有仅HTTP启用。还有,无论如何要安全**没有**存储会话在数据库中?这也是我的目标。但是如果不可能安全地做到这一点,我会放弃这一点。此外,我的使用用户代理的观点是,如果攻击者获得了cookie,至少他们必须知道使用它的确切浏览器配置 – Earlz 2011-03-05 04:14:34
另外,对于加密的随机数,如果您想要“记住我”从未过期的cookie? – Earlz 2011-03-05 04:20:23
@Earlz如果没有https,你很容易受到firesheep风格的攻击和它的owasp攻击。理想情况下,你会使用会占用所有这些的会话处理程序,我知道asp.net带有一个。如果由于某种原因您不能使用内置的会话处理程序,那么您可以使用存储在文件中的密钥对存储在数据库中的加密随机数进行加密。那么你应该确保你的数据库被锁定。 – rook 2011-03-05 04:20:23