ASP.NET MVC - AntiForgeryToken 是否会阻止用户更改发布的表单值?

Mar*_*rek 1 security asp.net-mvc

据我所知,ASP.NET MVC 中的 AntiForgeryToken 功能确实可以防止跨站点攻击。

但是,它是否会阻止在 POST 之前更改表单值?

例如,恶意攻击者可能会发现评级页面始终包含包含评级实体 ID 的隐藏字段,并创建 POST 请求来人为地对自己的所有实体进行高评级。

确保 GET 和 POST 之间的表单值不被更改的首选方法是什么?

Dar*_*rov 5

AntiForgeryToken 可防止恶意站点欺骗用户使用看起来与原始表单相同的表单并将其发布到原始站点。它不会阻止您所描述的场景。以下是攻击者绕过令牌的方法:

  1. 黑客向表单发送 GET 请求。
  2. 他读取 AntiForgeryToken 生成的 cookie 的值
  3. 他通过发送 cookie、与 cookie 具有相同值的 RequestVerificationToken 隐藏字段以及修改后的实体 ID 来 POST 到处理表单操作的 url。

正如您所看到的,与未使用 AntiForgeryToken 的唯一区别是,黑客需要发送额外的 GET 请求来读取令牌的值。

除了验证提交表单的用户(我认为为了投票,必须对用户进行身份验证)是否不是实体 ID 的所有者之外,绝对没有办法阻止攻击者修改隐藏字段的值。正在投票。