我正在构建一个专门为其请求和响应内容使用JSON的Web服务(即,没有表单编码的有效负载)。
如果以下情况属实,网络服务是否容易受到CSRF攻击?
没有顶级JSON对象的任何POST
请求(例如{"foo":"bar"}
)将被拒绝400.例如,POST
请求包含内容{ {1}}因此会被拒绝。
任何内容类型不是42
的{{1}}请求都将被400拒绝。例如,内容类型为POST
的{{1}}请求因此会被拒绝。
所有GET请求都是Safe,因此不会修改任何服务器端数据。
客户端通过会话cookie进行身份验证,会话cookie在通过带有JSON数据的POST提供正确的用户名/密码对后由Web服务提供。 application/json
。
辅助问题:POST
和application/x-www-form-urlencoded
请求是否容易受到CSRF的攻击?我问,因为似乎大多数(所有?)浏览器都不允许HTML表单中的这些方法。
编辑:添加了第4项。
编辑:到目前为止,有很多好的评论和答案,但没有人提供过这种Web服务易受攻击的特定CSRF攻击。答案 0 :(得分:59)
使用XHR实际上只能使用任意媒体类型伪造任意CSRF请求,因为form’s method is limited to GET and POST和form’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请求的唯一方式吗?