91

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

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

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

  2. 任何POST内容类型不是application/json400 的请求都将被拒绝。例如,POST内容类型的请求application/x-www-form-urlencoded将因此被拒绝。

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

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

辅助问题:PUTDELETE请求是否容易受到 CSRF 的攻击?我问是因为似乎大多数(所有?)浏览器都不允许在 HTML 表单中使用这些方法。

编辑:添加项目#4。

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

4

5 回答 5

79

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

所以唯一的威胁来自基于 XHR 的 CSRF 攻击。只有当它们来自同一来源时,它们才会成功,所以基本上来自您自己的网站(例如 XSS)。注意不要误将禁用 CORS(即不设置 Access-Control-Allow-Origin: *)作为保护。CORS 只是阻止客户端读取响应。整个请求仍然由服务器发送和处理。

于 2012-06-13T22:42:51.710 回答
3

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

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

它也适用于 Chrome。

于 2018-09-27T23:57:13.330 回答
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

于 2016-03-18T10:39:47.163 回答
-1

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

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

于 2014-03-07T17:34:03.620 回答
-7

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

是的。它仍然是 HTTP。

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

是的

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

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

于 2012-06-13T08:53:03.727 回答