2013-08-05 240 views
1

而不是使用ASP.NET MVC用户的系统,如下所示:ASP.NET MVC 4和会话安全漏洞

当他登录信息(用户名+密码),我取从数据库和一套相应的用户:

Session["UserId"] = fetchedUser.UserId; 

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

if (Session["UserId"] != null && ...) 

的问题是,如果有人复制ASP.NET_SessionId的从价值登录用户(例如:用户去卫生间和坐在他旁边的同事用铬检查员检查他的饼干),然后他将能够在他的电脑中创建一个cookie并作为该用户。

Chrome's inspector

我的问题是:如果会话ID保存在cookie中

  1. 为什么会议比饼干更安全吗?
  2. 我可以让这更安全(并继续使用会话)吗?
  3. 内部ASP.NET用户认证系统如何做到这一点?
+0

除非你在学习,否则安全不是你想要做的事情。你确定你不应该使用内置的安全性? –

回答

6

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

为了回答您的其他点:

为什么如果会话ID保存在一个 饼干的会议比饼干更安全吗?

存储在会话中的数据存储在服务器端,所以攻击者更难以篡改这些数据。所有的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" flag,以防止其被泄露通过HTTP一个MITM攻击。