ASP.NET 中的会话固定

Posted

技术标签:

【中文标题】ASP.NET 中的会话固定【英文标题】:Session Fixation in ASP.NET 【发布时间】:2011-01-25 00:43:19 【问题描述】:

我想知道如何防止 攻击(请参阅http://en.wikipedia.org/wiki/Session_fixation)

我的方法通常是在有人登录时生成并发出一个新的会话 ID。但是这种级别的控制在 ASP.NET 领域是否可行?

【问题讨论】:

我对会话固定的修复是关闭它! 【参考方案1】:

它会在用户登录时生成一个新的会话 ID,并在发生超时或用户导航离开/关闭浏览器时终止会话。您可以通过 Abandon() 可编程地杀死它或通过 Remove() 删除条目。

所以我不确定是什么问题?

【讨论】:

ASP.NET 通常会重用已设置的 cookie(启用会话固定),所以不,它并不总是在用户登录时生成新的 cookie。【参考方案2】:

如果我猜对了,你说的是……http://en.wikipedia.org/wiki/Session_fixation。简短的回答是肯定的,您也有很多方法可以保护您的 cookie。您不应使用无 cookie 会话,并且在使用会话时,请确保您已明确保护 cookie。

看看这篇文章...http://blogs.msdn.com/rahulso/archive/2007/06/19/cookies-case-study-with-ssl-and-frames-classic-asp.aspx

【讨论】:

他不太可能使用无 cookie 会话。会话固定更为常见,尤其是在 ASP.NET 中,带有 cookie 会话。您的链接是正确的,但与此主题无关​​,除了它们都与会话安全有关。【参考方案3】:

一直在做更多的挖掘。在任何 Web 应用程序中防止会话固定攻击的最佳方法是在用户登录时发出新的会话标识符。

在 ASP.NET 中,Session.Abandon() 不足以完成此任务。微软在http://support.microsoft.com/kb/899918 中声明:“”当您放弃会话时,会话 ID cookie 不会从用户的浏览器中删除。 因此,一旦会话被放弃,对同一应用程序的任何新请求都将使用相同的会话 ID,但会有一个新的会话状态实例。""

已在https://connect.microsoft.com/feedback/viewfeedback.aspx?FeedbackID=143361&wa=wsignin1.0&siteid=210#details 请求修复错误

有一种解决方法可以确保在http://support.microsoft.com/kb/899918 详细说明生成新会话 ID,这涉及调用 Session.Abandon,然后清除会话 ID cookie。

如果 ASP.NET 不依赖开发人员来做这件事会更好。

【讨论】:

这听起来是个不错的方法,但听起来登录时不会生成新的会话ID,所以攻击者理论上可以在共享计算机上设置cookie,然后等待有人使用它登录,并且会话 ID 不会被更新(攻击者会知道它)。正如您所说,开发人员绝对不必担心这一点。 我的印象是,只有在合法用户注销站点后发生攻击时,清除会话 ID cookie 才会有所帮助。但如果攻击者与合法用户同时访问该站点,此方法将失败。 我认为这个答案应该更新清楚,解决方法页面不再存在。 您可以使用 Wayback 机器来处理断开的链接。 web.archive.org/web/20170122000918/https://… @Rathma,该页面将尝试自动重定向您。反正也没那么有用。【参考方案4】:

基本上只需在您的 Login GET 方法和您的 Logout 方法中执行此操作:

Session.Clear();
Session.Abandon();
Session.RemoveAll();
if (Request.Cookies["ASP.NET_SessionId"] != null)

   Response.Cookies["ASP.NET_SessionId"].Value = string.Empty;
   Response.Cookies["ASP.NET_SessionId"].Expires = DateTime.Now.AddMonths(-20);

【讨论】:

这是一个很好的答案,但是对于第 1 3 行代码,只需要 Session.Abandon() ; .Clear() 和 .RemoveAll() 是多余的。使用所有 3 可能会给其他开发人员留下印象,即您正在尝试实现永远不会发生的事情,或者您认为 .Clear() 或 .RemoveAll() 中的某些内容在 .Abandon 中没有完成()。我还可能建议将您拥有的 Response.Cookies 代码放在 Session_OnEnd 中,这样如果会话因其他原因结束,您仍然可以清除 cookie。 .Abandon() 触发 session_onend()。

以上是关于ASP.NET 中的会话固定的主要内容,如果未能解决你的问题,请参考以下文章

登录asp.net后如何更改会话ID

ASP.NET 中的会话超时

什么是 ASP.NET 中的默认会话超时?

ASP.NET 中的 REST WCF 服务和会话

ASP.NET 中的 FluentNHibernate 会话管理

使用 asp.net 中的会话从帐户注销时遇到问题