我正在构建一个专门为其请求和响应内容使用JSON的Web服务(即,没有表单编码的有效负载) .
Is a web service vulnerable to CSRF attack if the following are true?
-
没有顶级JSON对象的任何
POST
请求(例如{"foo":"bar"}
)将被拒绝400.例如,具有内容42
的POST
请求将因此被拒绝 . -
具有除
application/json
以外的内容类型的任何POST
请求将被拒绝400.例如,具有内容类型application/x-www-form-urlencoded
的POST
请求将因此被拒绝 . -
所有GET请求都是Safe,因此不会修改任何服务器端数据 .
-
客户端通过会话cookie进行身份验证,Web服务在通过带有JSON数据的POST提供正确的用户名/密码对后为其提供,例如,
{"username":"user@example.com", "password":"my password"}
.
辅助问题: PUT
和 DELETE
请求是否容易受到CSRF的攻击?我问,因为似乎大多数(所有?)浏览器都不允许HTML表单中的这些方法 .
编辑:添加了第4项 .
编辑:到目前为止,有很多好的评论和答案,但没有人提供过这种Web服务易受攻击的特定CSRF攻击 .
5 回答
使用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攻击 . 只有他们要么那些才会成功
从同一个原点运行,所以基本上从你自己的网站运行(例如XSS),或
从不同的原点和server allows such cross-origin requests运行 .
如果您可以消除这两者,那么您的Web服务不容易受到CSRF的攻击 . 至少不是那些通过网络浏览器进行的 .
对的,这是可能的 . 您可以设置攻击者服务器,该服务器将向目标服务器发送307重定向到受害者计算机 . 您需要使用flash发送POST而不是使用Form .
参考:https://bugzilla.mozilla.org/show_bug.cgi?id=1436241
它也适用于Chrome .
可以使用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点有些怀疑 . 虽然它可以被认为是安全的,因为它不会改变服务器端的数据,但仍然可以读取数据,并且存在可能被盗的风险 .
http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx/
是 . 它仍然是HTTP .
是
您认为浏览器是发出HTTP请求的唯一方式吗?