gpt4 book ai didi

ASP.NET MVC 防伪 token 不安全

转载 作者:行者123 更新时间:2023-12-04 02:35:49 31 4
gpt4 key购买 nike

在没有 ssl 的情况下向服务器发出请求时,我实际上可以以纯文本形式看到 MVC3 框架生成的验证 token key 。

此 key 存储在名为:_RequestVerificationToken_Lw__ 的 cookie 中

在混合安全环境中,实际上可以在对非 ssl 站点的初始请求中以纯文本形式看到此 token 发送到服务器。该 token 在用户 session 期间也是静态的。那么当它很容易被攻击者窃取时,拥有这个 token 有什么用,因为 cookie 以纯文本形式被抛出。

这个 cookie 不应该被标记为安全的并且永远不会以纯文本形式发送吗?或者至少在每个请求上都重新生成,这样安全信息就不会从 ssl channel 中泄露出来?

我正在谈论 MVC 3 中的这个块 AntiForgeryWorker类(class)

private string GetAntiForgeryTokenAndSetCookie(HttpContextBase httpContext, string salt, string domain, string path)
{
string forgeryTokenName = AntiForgeryData.GetAntiForgeryTokenName(httpContext.Request.ApplicationPath);
AntiForgeryData token = (AntiForgeryData) null;
HttpCookie httpCookie = httpContext.Request.Cookies[forgeryTokenName];
if (httpCookie != null)
{
try
{
token = this.Serializer.Deserialize(httpCookie.Value);
}
catch (HttpAntiForgeryException ex)
{
}
}
if (token == null)
{
token = AntiForgeryData.NewToken();
string str = this.Serializer.Serialize(token);
HttpCookie cookie = new HttpCookie(forgeryTokenName, str)
{
HttpOnly = true,
Domain = domain
};
if (!string.IsNullOrEmpty(path))
cookie.Path = path;
httpContext.Response.Cookies.Set(cookie); //Ma, Why isn't this marked as "SECURE"
}
return this.Serializer.Serialize(new AntiForgeryData(token)
{
Salt = salt,
Username = AntiForgeryData.GetUsername(httpContext.User)
});
}

最佳答案

为了防止 CSRF 攻击,最佳解决方案是始终使用 SSL。如果没有 SSL,是的,nonce——正如它所说的那样——很容易受到 MITM 攻击。使用 cookie 存储 nonce 时,cookie 必须标记为 HTTP-only。这可以防止 JavaScript 读取 cookie。您还应该将随机数呈现为 <input type="hidden" value="nonce">标签内所有 <form>除了 cookie。

任何有权访问浏览器本身的人都可以读取随机数,防止重放攻击的唯一方法是让随机数在服务器第一次验证后第一次过期。然而,当用户使用后退按钮并使用相同的随机数重新提交请求时,这种方法可能会导致糟糕的用户体验。由于您使用的是 ASP.NET MVC 的内置反 CSRF 保护机制,因此将其行为更改为只允许使用一次随机数可能并不容易。 (编辑:感谢下面的 Levi 告诉我 ASP.NET MVC 实际上使这变得非常简单)

如果您想更好地控制生成和验证随机数,那么我建议滚动您自己的实现,就像我在 JuniorRoute 框架中所做的那样。其实你可以看看JuniorRoute's source code看看我是如何实现的。 Stack Overflow 帖子的代码太多了。

关于ASP.NET MVC 防伪 token 不安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22519643/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com