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

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

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

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

  2. 任何具有application/json以外的内容types的POST请求都将被拒绝,例如,带有内容typesapplication/x-www-form-urlencodedPOST请求将被拒绝。

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

  4. 客户端通过会话cookie进行身份validation,web服务通过带有JSON数据的POST提供正确的用户名/密码对,例如{"username":"user@example.com", "password":"my password"}

辅助问题: PUTDELETE请求是否容易受到CSRF的影响? 我问,因为它似乎大多数(所有?)浏览器不允许在HTMLforms这些方法。

编辑:添加项目#4。

编辑:到目前为止,很多好评和答案,但没有人提供了一个特定的CSRF攻击,这个Web服务是脆弱的。

由于表单的方法仅限于GET和POST , 表单的POST消息体也限制为三种格式application/x-www-form-urlencodedmultipart/form-data application/x-www-form-urlencoded ,所以只能使用XHR来伪造任意媒体types的任意CSRF请求。 multipart/form-datatext/plain 。 但是, 使用表单数据编码text/plain ,仍然可以伪造包含有效JSON数据的请求 。

所以唯一的威胁来自基于XHR的CSRF攻击。 而那些也只会是成功的

  • 从相同的来源运行,所以基本上从你自己的网站(例如XSS),或者
  • 从不同的来源运行,您的服务器允许这样的跨源请求 。

如果你可以消除这两者,你的Web服务不容易受到CSRF的攻击。 至less不是通过networking浏览器进行的。

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

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

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

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

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

是。 它仍然是HTTP。

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

似乎大多数(所有)浏览器都不允许HTML格式的这些方法

你认为浏览器是做HTTP请求的唯一方法吗?