【问题标题】:Unexpected behaviour with AntiForgeryToken and ValidateAntiForgeryTokenAntiForgeryToken 和 ValidateAntiForgeryToken 的意外行为
【发布时间】:2011-12-15 20:01:26
【问题描述】:

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

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

然而,我遇到的行为是:

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

有人有什么想法吗?

【问题讨论】:

  • 好的,刚刚发现stackoverflow.com/questions/7186253/… 指出它们的序列化方式不同,因此它们似乎包含不同的值。然而,这并不能解释为什么我的 cookie 值永远不会改变(直到我删除它并在我重新获取页面时生成一个新的值),但输入值确实改变了,或者为什么它总是有效。
  • 这种行为似乎只发生在安全请求中。

标签: asp.net-mvc forms post csrf antiforgerytoken


【解决方案1】:

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

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

我建议你阅读 Phil Haack 的这篇文章:Anatomy of a Cross-site Request Forgery Attack

【讨论】:

  • 当我在 CSRF 站点中按原样(带有隐藏的表单字段)提取代码,然后提交表单时,它总是在服务器上验证。显然,如果代码不存在,它不会像预期的那样验证。仍然不知道为什么 cookie 值保持不变。
猜你喜欢
  • 2017-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多