2

我已经开始在我的一些表单中使用 AntiForgeryToken 来防止跨站点请求伪造。但是我得到了一些奇怪的行为,只是想澄清这是一个错误还是我做错了什么。我正在使用Html.AntiForgeryToken()我的表单中的调用。[ValidateAntiForgeryToken]然后,我在表单发布到的操作方法中使用该属性。在这一点上,我没有使用盐。

我的理解是,它会Html.AntiForgeryToken()生成一个名为 的隐藏输入和一个名为__RequestVerificationToken的 cookie __RequestVerificationToken_Lw__,它们都应该包含相同的值。

然而,我遇到的行为是:

  1. 无论您获取页面多少次,cookie 始终具有相同的值
  2. 每次获取页面时隐藏的输入都有不同的值
  3. ValidateAntiForgeryToken 每次都进行验证,即使来自 CSRF 场景中的不同站点。
  4. 如果我更改了外部站点中隐藏输入的值,则令牌不会验证(预期的行为,但为什么当隐藏输入/cookie 值不同时它会验证?)

有人有什么想法吗?

4

1 回答 1

2

对于数字 3,您是否在 CSRF 场景中包含隐藏字段?

AntiForgeryToken 的安全性在于隐藏输入只存在于您的域服务的页面中,不能被其他域复制或捕获。如果您模拟了一个通过隐藏输入的测试,那么这不是一个有效的测试。

我建议您阅读 Phil Haack 的这篇文章: 跨站点请求伪造攻击的剖析

于 2011-10-26T18:47:36.743 回答