【问题标题】:AntiForgeryToken changes per request每个请求的 AntiForgeryToken 更改
【发布时间】:2012-07-04 01:20:08
【问题描述】:

我正在使用AntiForgeryToken 辅助方法。根据我对 AntiForgeryToken 的了解,它是会话基础,因此每个用户都有相同的令牌,但另一个用户将有不同的令牌(前提是您对所有表单使用相同的盐)。我的“问题”是AntiForgeryToken 正在为具有相同盐的同一用户生成不同的令牌。比如……

控制器

public ActionResult Test()
{
    return View();
}

查看

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken("Salty!")
}

输出请求 #1

<input name="__RequestVerificationToken" type="hidden" value="K1sijFuYvyGUJjGg33OnLjJaU3tFpGFDutRt9TOFSkZ6FcrhJMMQPnOqjIHuTwBXs/sPBXEiE+1qyV9l63nnSO161b+OtLbaBoPC7K3/7wxtnuSY+N0o/fqBgVoDyac4dNVp+OvanKBSrHINKfc3WEg9269BHOJNzFowC6Aeac/afAGTGrBypxUHfqrKVowD" />

输出请求 #2

<input name="__RequestVerificationToken" type="hidden" value="mOpP6LMQXnCmjr5/Wdtnhguh3PyZxWj7GWf8LYzZXPKcJBBT+DbAHvynquSD65O0DBw1RKR7DxCNg372ukftCOWms+o75CraMyFMnvjGk7RU+znIQm05eRQvr5H6d/MDyn+0DWm3jLnMBM9GplsgMRqbdAHzSe69/cS2x9A4X/9jFTZQHUWXXHUr0xewF8Rk" />

同一会话使用相同的盐,密钥是不同的。我对 CRSF 保护有根本的误解吗?还是这是一项新功能?

【问题讨论】:

    标签: c# .net asp.net-mvc security csrf


    【解决方案1】:

    反 XSRF 令牌通过将相同的 random 值加密到会话 cookie 和您的表单中来工作。会话 cookie 仅在您使用已生成的表单发布帖子时提交。

    这种方法也适用,例如在所有服务器共享加密密钥的服务器场上(在负载平衡场景中)。验证仅通过比较来自发布的表单数据的解密值和来自发布的会话 cookie 的解密值来进行。这称为double submitted cookie 方法。

    所以每个请求获得不同的值是很正常的。 This is a nice post 关于 ASP.NET MVC XSRF 令牌。

    【讨论】:

    • 所以当一个新的token发出时它会改变服务器上的会话数据?我的 cookie 的所有值都保持不变。我认为 RequestVerificationToken_Lw cookie 值会改变。
    • 不,服务器在客户端设置cookie。然后客户端在发布时发送相同的值两次。一次在表单数据中编码,一次在 cookie 中(cookie 在 POST 上被传输到服务器)。服务器只知道加密密钥。它不会为反 XSRF 目的存储任何其他内容。
    • 有什么理由不将令牌存储在会话中而不将其发送给客户端?类似于: AntiForgery.GetTokens(null, out cookieToken, out formToken);返回 cookieToken + ":" + formToken;然后将其存储在会话中?
    • @Jack 这种方法不需要服务器状态。即使您将值保存在用户会话中,您仍然需要将其与已发布的表单值进行比较,以确保请求确实来自您的站点。否则,任何网站(例如在另一个选项卡中)都可能在用户不知情的情况下在用户会话中向您的网站发起呼叫。他只需要登录并访问一个恶意网站。
    • 这是否意味着在同一个会话中,隐藏字段中的 __RequestVerificationToken 将根据请求更改,而 cookie 中的相同将保持不变。在我们的 QA 环境中,当我们导航到其他页面时,我们遇到了隐藏字段中的令牌没有改变的情况。在隐藏字段中获得相同值可能是什么问题?
    猜你喜欢
    • 2018-04-24
    • 2014-03-29
    • 2018-12-29
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 2014-01-15
    • 2018-09-05
    • 1970-01-01
    相关资源
    最近更新 更多