JSON Web服务是否容易受到CSRF攻击?

时间:2012-06-13 05:03:51

标签: http security csrf

我正在构建一个专门为其请求和响应内容使用JSON的Web服务(即,没有表单编码的有效负载)。

如果以下情况属实,网络服务是否容易受到CSRF攻击?

  1. 没有顶级JSON对象的任何POST请求(例如{"foo":"bar"})将被拒绝400.例如,POST请求包含内容{ {1}}因此会被拒绝。

  2. 任何内容类型不是42的{​​{1}}请求都将被400拒绝。例如,内容类型为POST的{​​{1}}请求因此会被拒绝。

  3. 所有GET请求都是Safe,因此不会修改任何服务器端数据。

  4. 客户端通过会话cookie进行身份验证,会话cookie在通过带有JSON数据的POST提供正确的用户名/密码对后由Web服务提供。 application/json

  5. 辅助问题:POSTapplication/x-www-form-urlencoded请求是否容易受到CSRF的攻击?我问,因为似乎大多数(所有?)浏览器都不允许HTML表单中的这些方法。

    编辑:添加了第4项。

    编辑:到目前为止,有很多好的评论和答案,但没有人提供过这种Web服务易受攻击的特定CSRF攻击。

5 个答案:

答案 0 :(得分:59)

使用XHR实际上只能使用任意媒体类型伪造任意CSRF请求,因为form’s method is limited to GET and POSTform’s POST message body is also limited to the three formats application/x-www-form-urlencoded, multipart/form-data, and text/plain。但是,with the form data encoding text/plain it is still possible to forge requests containing valid JSON data

因此,唯一的威胁来自基于XHR的CSRF攻击。而那些只有在

的情况下才会成功

如果您可以消除这两者,那么您的Web服务不容易受到CSRF的攻击。至少不是那些通过网络浏览器进行的。

答案 1 :(得分:2)

是的,有可能。您可以设置攻击者服务器,该服务器将向目标服务器发送307重定向到受害机器的重定向。您需要使用flash发送POST而不是使用Form。

参考:https://bugzilla.mozilla.org/show_bug.cgi?id=1436241

它也可以在Chrome上使用。

答案 2 :(得分:1)

可以使用Ajax对基于JSON的Restful服务执行CSRF。我在一个应用程序上测试了这个(使用Chrome和Firefox)。 您必须将contentType更改为text / plain,将dataType更改为JSON才能获得预检请求。然后您可以发送请求,但是为了发送sessiondata,您需要在ajax请求中设置withCredentials标志。 我在这里更详细地讨论这个问题(包括参考文献):

http://wsecblog.blogspot.be/2016/03/csrf-with-json-post-via-ajax.html

答案 3 :(得分:-1)

我对第3点有些怀疑。虽然它可以被认为是安全的,因为它不会改变服务器端的数据,但仍然可以读取数据,并且存在可能被盗的风险。

http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx/

答案 4 :(得分:-6)

  

如果以下情况属实,Web服务是否容易受到CSRF攻击?

是。它仍然是HTTP。

  

PUT和DELETE请求是否容易受到CSRF的攻击?

  

似乎大多数(所有?)浏览器都不允许在HTML表单中使用这些方法

您认为浏览器是发出HTTP请求的唯一方式吗?