ASP.NET MVC 4和会话安全漏洞

spo*_*rts 1 asp.net security session sessionid

而不是使用ASP.NET MVC用户的系统,我只是使用session,如下所示:

当他登录(用户名+密码)时,我从数据库中获取相应的用户并设置:

Session["UserId"] = fetchedUser.UserId;
Run Code Online (Sandbox Code Playgroud)

然后,我总是检查他是否登录:

if (Session["UserId"] != null && ...)
Run Code Online (Sandbox Code Playgroud)

问题是,如果有人从登录用户复制ASP.NET_SessionId的值(例如:用户进入浴室,坐在他旁边的同事用铬检查员检查他的饼干),那么他将能够创建一个cookie在他的计算机中并充当该用户.

Chrome的检查员

我的问题是:

  1. 如果会话ID保存在cookie中,为什么会话比cookie更安全?
  2. 我可以使这更安全(并继续使用会话)吗?
  3. 内部ASP.NET用户身份验证系统如何做到这一点?

Sil*_*Fox 6

不使用Session作为身份验证机制的主要原因是它可能使您的应用程序容易受到Session Fixation的攻击.例如,问题可能是用户使用HTTP协议到达您的站点并收到存储在ASP.NET_SessionIdcookie中的会话ID .用户可以稍后登录,即使您的登录页面可能在HTTPS下受到保护,会话令牌也已在HTTP下生成,这意味着它已使用明文传输.

回答你的其他观点:

如果会话ID保存在cookie中,为什么会话比cookie更安全?

存储在会话中的数据存储在服务器端,因此攻击者更难以篡改此数据.所有cookie存储都是此数据的标记,而不是数据本身.话虽如此,使用它仍然更安全,FormsAuthenticationProvider因为这会在登录完成时创建新的身份验证令牌,而不是在会话启动时出于避免会话固定的原因,如上所述.

我可以使这更安全(并继续使用会话)吗?内部ASP.NET用户身份验证系统如何做到这一点?

内置提供程序已经适合用途,因此最好使用它而不是捏造另一种机制来满足您的要求.它也很容易扩展,因此您可以根据自己的需要进行自定义.ASP.NET用户身份验证创建加密票证并将其存储在cookie中,而不是存储对服务器端变量的引用:http://support.microsoft.com/kb/910443

我还会提请您注意注销机制以及如何保护它.尤其

调用SignOut方法仅删除表单身份验证cookie.Web服务器不存储有效和过期的身份验证票证以供以后比较.如果恶意用户获得有效的表单身份验证cookie,这会使您的站点容易受到重播攻击.

详细信息:http://msdn.microsoft.com/en-us/library/system.web.security.formsauthentication.signout.aspx

此外,您可能希望在ASP auth cookie上设置"secure"标志,以防止它被MITM攻击者通过HTTP泄露.