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

Posted

技术标签:

【中文标题】ASP.NET MVC 4 和会话安全漏洞【英文标题】:ASP.NET MVC 4 and session security leak 【发布时间】:2013-08-06 19:08:29 【问题描述】:

我没有使用 ASP.NET MVC 用户的系统,而是简单地使用会话,如下所示:

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

Session["UserId"] = fetchedUser.UserId;

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

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

问题在于,如果有人从登录用户那里复制了 ASP.NET_SessionId 的值(例如:用户去洗手间,坐在他旁边的同事用 chrome 检查器检查他的 cookie) ,然后他将能够在他的计算机中创建一个 cookie 并充当该用户。

我的问题是:

    如果会话 ID 保存在 cookie 中,为什么会话比 cookie 更安全? 我可以让它更安全(并继续使用会话)吗? 内部 ASP.NET 用户认证系统是如何做到的?

【问题讨论】:

安全不是您想要自己做的事情,除非您正在学习。您确定不应该使用内置安全性吗? 【参考方案1】:

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

回答你的其他观点:

如果会话 ID 保存在 饼干?

session中存储的数据是存储在服务器端的,因此攻击者更难篡改这些数据。所有 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,以防止 MITM 攻击者通过 HTTP 泄露它。

【讨论】:

以上是关于ASP.NET MVC 4 和会话安全漏洞的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC 和 WCF 服务安全 - 身份验证、路由

如何将我的请求中的安全主体传递到 asp.net MVC 中的线程中

ASP.NET MVC Web API 身份验证令牌安全问题

asp.net mvc 站点的安全最佳实践?

3.0.0.1 版的 ASP.NET MVC 安全补丁中断了构建 [重复]

asp.net和sql2008的特点和功能