ASP.NET中的会话修复

AJM*_*AJM 16 asp.net security session

我想知道如何防止ASP.NET中的会话固定攻击(参见http://en.wikipedia.org/wiki/Session_fixation)

我的方法通常是在有人登录时生成并发出新的会话ID.但是这种控制级别是否可以在ASP.NET中使用?

AJM*_*AJM 17

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

在ASP.NET Session.Abandon()不足以完成此任务.Microsoft在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不依赖开发人员这样做会更好.

  • 我认为此答案应该进行更新以明确说明,解决方法页面不再存在。 (3认同)
  • 这听起来是一个好方法,但听起来它在登录时不会生成新的会话 ID,因此攻击者理论上可以在共享计算机上设置 cookie,然后等待某人使用它登录,然后会话 ID 不会更新(攻击者会知道这一点)。正如您所说,开发人员绝对不必担心这一点。 (2认同)

Ser*_*gan 6

基本上只需在您的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);
}
Run Code Online (Sandbox Code Playgroud)

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