2011-03-05 71 views
3

我最近读过杰夫的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纯文本中存储的唯一信息是用户名。

回答

6

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

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

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

+0

我目前没有HTTPS在我的网站,我也有仅HTTP启用。还有,无论如何要安全**没有**存储会话在数据库中?这也是我的目标。但是如果不可能安全地做到这一点,我会放弃这一点。此外,我的使用用户代理的观点是,如果攻击者获得了cookie,至少他们必须知道使用它的确切浏览器配置 – Earlz 2011-03-05 04:14:34

+0

另外,对于加密的随机数,如果您想要“记住我”从未过期的cookie? – Earlz 2011-03-05 04:20:23

+1

@Earlz如果没有https,你很容易受到firesheep风格的攻击和它的owasp攻击。理想情况下,你会使用会占用所有这些的会话处理程序,我知道asp.net带有一个。如果由于某种原因您不能使用内置的会话处理程序,那么您可以使用存储在文件中的密钥对存储在数据库中的加密随机数进行加密。那么你应该确保你的数据库被锁定。 – rook 2011-03-05 04:20:23