它防止通过JSON劫持泄露响应。
从理论上讲,HTTP响应的内容受同源策略的保护:来自一个域的页面不能从其他域的页面获取任何信息(除非明确允许)。
因此,如果您访问攻击者的页面,则无法从gmail.com读取您的电子邮件。
除了在使用脚本标记来请求JSON内容时,JSON在攻击者的受控环境中以Javascript执行。 如果攻击者可以replaceArray或Object构造函数或其他在构造对象时使用的方法,则JSON中的任何内容都将通过攻击者的代码并被泄露。
请注意,这发生在JSON作为Javascript执行时,而不是在parsing时。
有多种对策:
确保JSON永远不会执行while(1);
while(1);
for(;;);
确保JSON不是有效的Javascript
&&&START&&&
始终使用外部对象返回JSON
OWASP
与之前的对策类似,它确保JSON永远不会以Javascript的forms执行。
一个有效的JSON对象,当没有被任何东西包围时,在Javascript中是无效的:
eval('{"foo":"bar"}') // SyntaxError: Unexpected token :
这是有效的JSON:
JSON.parse('{"foo":"bar"}') // Object {foo: "bar"}
所以,确保你总是返回一个响应顶层的对象,确保JSON不是有效的Javascript,而仍然是有效的JSON。
{}
以上方法比较
OWASP的方式不那么干扰,因为它不需要客户端库更改,并传输有效的JSON。 但是,不确定过去或未来的浏览器错误是否能够击败这一点。 正如@oriadam指出的那样,通过error handling(例如window.onerror)是否可能泄露数据在parsing错误中是不清楚的。
谷歌的方式要求客户端库,以支持自动反序列化,可以被认为是更安全的浏览器错误。
这两种方法都需要服务器端的更改,以避免开发人员意外地发送易受攻击的JSON。