Session 会话固定-更改asp.net core 2上的会话ID
根据我所了解的情况,我们Session 会话固定-更改asp.net core 2上的会话ID,session,asp.net-core,Session,Asp.net Core,根据我所了解的情况,我们 sessionId存储在cookie.AspNetCore.Session 删除Cookie并清除会话不会产生任何效果 context.HttpContext.Session.Clear(); foreach (var cookie in context.HttpContext.Request.Cookies.Keys) { context.HttpContext.Response.Cookies.Delete(cookie); } 因此,问题是我们能否以
sessionId
存储在cookie.AspNetCore.Session
context.HttpContext.Session.Clear();
foreach (var cookie in context.HttpContext.Request.Cookies.Keys)
{
context.HttpContext.Response.Cookies.Delete(cookie);
}
因此,问题是我们能否以某种方式更改
会话ID
,或者是否有办法保护我们不受会话修复的影响?会话。清除只会删除会话中的所有数据,实际上不会删除会话本身。这将在达到超时时发生。在我看来,ASP.NET核心团队没有实现以前存在的会话。放弃,这是一个奇怪的选择,因为这实际上会删除实际会话本身
只要实际会话仍然存在,即使它的数据不再存在,它仍然可以由该会话id检索,因此,问题转移到客户端
重要的是,服务器实际上不能让客户机做任何事情。调用Cookies.Delete
实际上只为过期日期在过去的同一个Cookie发送一个新的Set Cookie
响应头。这将提示客户端(最有可能是浏览器)删除该cookie,因为它现在已过期。但是,这完全是客户端的100%,因此,如果出现错误,或者客户端没有接受更改,或者客户端出于任何原因拒绝遵守,cookie将保留。然后,如果cookie仍然存在,并且由其包含的会话id标识的会话仍然存在,则可以恢复该会话
长话短说,你所拥有的代码应该是有效的,除了你已经在做的事情之外,你真的没有别的事情可以做。如果会话没有被放弃,那么在某个地方还存在一些其他问题(很可能是客户端的问题)
…或者有没有办法保护我们不受会话修复的影响
是的,有!国家:
不幸的是,某些平台,尤其是Microsoft ASP,不会为sessionid Cookie生成新值,而只是将现有值与新会话关联。这保证了几乎所有的ASP应用程序都容易受到会话固定的攻击,除非它们已经采取了特定的措施来防止会话固定
同一页推荐了一种ASP.Net方法,我们在所有ASP.Net应用程序中都使用了这种方法,并且通过了pen测试。我认为它对ASP.Net Core仍然有效:
我们的想法是,由于ASP禁止对AspSessionIdxxxx cookie的写入访问,并且不允许我们以任何方式更改它,因此我们必须使用我们可以控制的其他cookie来检测任何篡改。因此,我们将用户浏览器中的cookie设置为随机值,并将会话变量设置为相同的值。如果会话变量和cookie值不匹配,那么我们就有潜在的固定攻击,应该使会话无效,并强制用户再次登录
这是我们在.Net Core Razor页面中如何实现这一点的一个简化示例,应该让您了解如何自己实现它:
public IActionResult OnPost()
{
登录();
返回重定向(“~/Login”);
}
私有void登录()
{
//检查用户的凭据并执行所有其他必要的操作。
// ...
//创建用于保护会话的随机值。
字符串authId=GenerateAuthId();
//将值存储在会话和Cookie中。
HttpContext.Session.SetString(“AuthId”,AuthId);
CookieOptions=新建CookieOptions()
{
Path=“/”,
HttpOnly=true,
安全=正确,
SameSite=严格
};
Append(“AuthCookie”,authId,options);
}
私有字符串GenerateAuthId()
{
使用(RandomNumberGenerator rng=new RNGCryptoServiceProvider())
{
字节[]令牌数据=新字节[32];
rng.GetBytes(令牌数据);
返回Convert.ToBase64String(tokenData);
}
}
检查会话和Cookie的内容,无论您需要它在哪里。如果它们不匹配,您应该清除
会话(我认为,会话.放弃
在.Net Core中仍然可用)并注销用户
public void OnGet()
{
字符串cookieValue=Request.Cookies[“AuthCookie”];
string sessionValue=HttpContext.Session.GetString(“AuthId”);
如果(cookieValue==null | | sessionValue==null | | cookieValue!=sessionValue)
{
//使会话无效并注销当前用户。
}
}