2

这篇文章描述了所有 JSON HttpGet 和 HttpPost AJAX 调用的标记系统:

简而言之,您使用 AntiForgeryToken 属性在页面上创建一个令牌,然后手动验证该值是否通过 AJAX 调用发送回控制器。

http://www.asp.net/web-api/overview/security/preventing-cross-site-request-forgery-(csrf)-attacks

经过数小时的互联网侦查,总是有人提到这种可能性,但没有人真正实现它。相反,通常重复的技术是 1) 仅使用 HttpPost AJAX 请求(这会破坏 REST),2) 将所有 json 响应包装在一个匿名对象中,这会导致 .net MVC4 中的代码非常不优雅,3) 使用无法解析的 cruf,这会破坏常用库,例如​​主干.js

那么为什么我们不都使用上面链接的令牌系统呢?我错过了什么?

4

1 回答 1

3

如果您关心 CSRF,并且您关心 REST 并正确执行 REST,那么您不应该在 GET 中做任何会受 CSRF 影响的事情,因为 AntiForgeryTokens 的全部目的是处理不断变化的数据(即,如果不首先获取包含令牌的页面,则不能使用 AntiForgeryToken)。

因此,说使用 POST“破坏 REST”似乎首先误解了您使用令牌的目的。确实,GET 可以暴露敏感信息,但是如果您想将它与 GET 一起使用,则必须先有某种方法来获取令牌。

Ajax 和 AntiForgeryToken 与 json 和 Ajax 的真正问题是“内置”验证仅适用于表单值,而不适用于 json。因此,您必须自己进行验证,并且您链接到的那篇文章很好地解释了如何做到这一点。

于 2013-04-24T03:32:58.380 回答