据我所知,ASP.NET MVC中的AntiForgeryToken功能确实可以防止跨站点攻击.
但是,它是否会阻止在POST之前更改表单值?
例如,恶意攻击者可能会发现评级页面始终包含一个隐藏字段,该字段包含评级实体ID,并创建POST请求以人为地评估所有自己的实体.
确保GET和POST之间的表单值没有更改的首选方法是什么?
解决方法
AntiForgeryToken可防止恶意网站欺骗用户使用与原始网站相同的表单并将其发布到原始网站.它不会阻止您描述的场景.以下是攻击者为了规避令牌而可以继续进行的操作:
>黑客向表单发送GET请求.
>他读取AntiForgeryToken生成的cookie的值
>他通过发送cookie来POST处理表单操作的url,RequestVerificationToken隐藏字段与cookie和修改后的实体ID具有相同的值.
正如您所看到的,唯一的区别就是您没有使用过AntiForgeryToken,黑客需要发送额外的GET请求来读取令牌的值.
绝对没有办法阻止攻击者修改隐藏字段的值,除了验证提交表单的用户(我认为为了投票用户必须进行身份验证)不是实体ID的所有者他正在投票.