1

我正在开发一个 Web 应用程序,其中所有动态内容都通过 Ajax 请求作为 JSON 检索。我正在考虑是否应该保护 GET API 调用不被来自不同来源的调用?

GET 请求不会修改状态,普遍的看法是它们不需要 CSRF 保护。但我想知道是否没有浏览器将此类请求的结果泄漏到不同源站点的极端情况?

例如,如果不同的源站点将 /users/emails 作为脚本、css 或 img 获取,浏览器是否有可能将生成的 json 泄漏到调用站点(例如通过 javascript onerror 处理程序)?

浏览器是否提供了足够强的保证来保证跨源 JSON 响应的内容不会泄露?你认为保护 GET 请求免受跨源调用是有意义的还是有点矫枉过正?

4

3 回答 3

1

您已经确定了一个极端案例,但高度相关的问题。确实存在这种可能性,它被称为 JSON 包含或跨站点脚本包含或 Javascript 包含,具体取决于您所指的对象。基本上,攻击是在一个邪恶的网站上执行,然后在 js 引擎解析它后通过 javascript 访问结果。

简短的故事是,您的所有 JSON 响应都必须包含在一个对象中,而不是一个数组或 JSONP(所以:{...}),并且为了更好地衡量您应该以前缀(while(1),对于(;;) 或解析器中断器)。查看 facebook 或 google 的 JSON 响应以获取实时示例。或者,您可以使用 CSRF 保护使您的 URL 不可猜测——这两种方法都有效。

于 2012-07-04T01:08:06.207 回答
0

不:

这不是 CSRF 问题,只要您返回纯 JSON 并且您的 GET 没有副作用,它就不必受到​​ csrf 保护。

Paradoxengine 提到的是另一个漏洞:如果您使用 JSONP,攻击者可能会读取发送给经过身份验证的用户的 JSON。即使使用常规 JSON ,也可以通过这种方式攻击非常旧的浏览器(IE 5.5)的用户。

于 2013-11-27T10:24:38.773 回答
0

您可以将请求发送到不同的域(这是 CSRF 攻击所做的),但您无法读取响应。

我从这里的另一个堆栈溢出问题中了解到这一点似乎我对 CSRF 的理解不正确? 希望这可以帮助您理解问题。

于 2014-08-22T08:30:21.413 回答