我构建一个只使用JSON其请求和响应的内容(即无形式编码的有效载荷)的Web服务。
是一个Web服务容易受到CSRF攻击,如果以下为真?
任何POST
没有顶层JSON对象请求,例如, {"foo":"bar"}
将与400。例如被拒绝,一个POST
与内容请求42
将因此被拒绝。
任何POST
与内容类型比其它请求application/json
将与400。例如被拒绝,一个POST
与内容类型请求application/x-www-form-urlencoded
将由此拒绝。
所有的GET请求将是安全的 ,因此不能修改任何服务器端的数据。
客户端通过一个会话cookie,使Web服务给了他们通过与JSON数据,例如POST提供正确的用户名/密码对后验证{"username":"user@example.com", "password":"my password"}
。
补充问题:是否PUT
和DELETE
请求以往容易受到CSRF? 我问,因为它似乎大多数(所有?)浏览器不允许在HTML表单这些方法。
编辑:添加项目#4。
编辑:好的意见和答案很多,到目前为止,但没有人提供了一个特定的CSRF攻击到该Web服务是脆弱的。
锻造用任意媒体类型任意CSRF请求被有效唯一可能与XHR,因为一个形式的方法是有限的GET和POST和形式的POST消息主体还限定于三种格式application/x-www-form-urlencoded
, multipart/form-data
,以及text/plain
。 然而, 与表单数据编码text/plain
它仍然是可能的伪造包含有效JSON数据请求 。
因此,唯一的威胁来自于基于XHR-CSRF攻击。 而那些只能成功,如果他们要么
- 来自同一产地,从您自己的网站以某种方式(如XSS)中运行,所以基本上,或
- 从不同来源运行,您的服务器允许这种跨域请求 。
如果你能同时消除,您的Web服务不会受到CSRF。 至少不是那些通过网络浏览器进行。
对的,这是可能的。 您可以设置将发送回一个307攻击者的服务器重定向到目标服务器到受害者的机器。 您需要使用闪光灯发送POST而不是使用表格。
参考: https://bugzilla.mozilla.org/show_bug.cgi?id=1436241
这也适用于Chrome。
这是可以做到的CSRF采用Ajax JSON基于RESTful服务。 我测试了这个上的应用程序(同时使用Chrome和Firefox)。 你必须要改变的contentType为text /平原和数据类型为JSON以avaoid预检请求。 然后你就可以发送请求,但为了送sessiondata,您需要设置withCredentials标志在你的Ajax请求。 我在这里(参考文献包括在内)更详细地讨论这样的:
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/
是一个Web服务容易受到CSRF攻击,如果以下为真?
是。 它仍然是HTTP。
被PUT和DELETE请求以往容易受到CSRF?
是
似乎大多数(所有?)浏览器不允许在HTML表单这些方法
你认为浏览器是使一个HTTP请求的唯一途径?