Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 制作安全的登录cookie_Asp.net_Security_Authentication_Cookies - Fatal编程技术网

Asp.net 制作安全的登录cookie

Asp.net 制作安全的登录cookie,asp.net,security,authentication,cookies,Asp.net,Security,Authentication,Cookies,我最近读了Jeff的一篇文章,它让我思考如何更好地保护我自制的身份验证系统中的登录cookie 基本上我现在做的是(注意,所有内容都是可配置的,当前设置为true): (请注意,passwordhash由密码、唯一salt和用户名组成) 好的,我做的一件可疑的事情就是使用UserAgent字符串。这样做有害吗?或者在正常操作下(如中,不更新)更改其UserAgent字符串的浏览器?我的目标基本上是,如果攻击者获得登录cookie,他们将无法对其执行任何操作。这是否有助于实现我的目标,还是对用户来

我最近读了Jeff的一篇文章,它让我思考如何更好地保护我自制的身份验证系统中的登录cookie

基本上我现在做的是(注意,所有内容都是可配置的,当前设置为
true
):

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


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

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

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


cookie值必须始终为,此值必须过期(最好少于一天)。为了增加安全性,启用有助于阻止xss。还将设置为强制使用https,并依次处理OWASP A9。还有,别忘了。此外,检查用户代理绝对没有意义,因为这是一个攻击者控制的变量

我目前在我的网站上没有HTTPS,我只启用了http。还有,在不将会话存储在数据库中的情况下,是否还有安全措施?这也是我的目标。但如果这是不可能做到安全,我会放弃这一点。我使用用户代理的另一个要点是,如果攻击者得到一个cookie,至少他们必须知道确切的浏览器配置才能使用它。因此,对于加密当前,如果您想要一个永不过期的“记住我”cookie,该怎么办?@Earlz如果没有https,您很容易受到firesheep式的攻击,并且违反owasp。理想情况下,您可以使用一个会话处理程序来处理所有这些,我知道asp.net附带了一个。如果由于某种原因无法使用内置会话处理程序,则可以使用存储在文件中的密钥加密存储在数据库中的加密nonce。然后,您应该确保您的数据库已锁定。@Earlz cookie仍然需要过期,或者它违反了CWE,并且存在漏洞。如果cookie值从发布日期起已超过24小时,则可以为下一个请求重新生成cookie值,并且cookie值的另一个上限可能为一周或一个月。我不会让时间再长了,即使这样也很不舒服,因为这个值很容易受到暴力的影响。@Earlz:我只能补充一点Rook已经说过的话:你检查用户代理的方法是无用的,因为攻击者可以很容易地更改它,而且当他计算哈希时,他可以只使用他的用户代理字符串,甚至不知道结果真正用户的一个。如果您只验证他的哈希是否“正确”,那么它将是正确的。不要发明“自制的认证系统”。如果您想要无数据库查找的安全会话,请阅读安全Cookie协议论文()。
     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());
    }