为什么Google会while(1);在其(私人)JSON响应前加上?
例如,这是在Google日历中打开和关闭日历时的响应:
while(1);[['u',[['smsSentFlag','false'],['hideInvitations','false'],
['remindOnRespondedEventsOnly','true'],
['hideInvitations_remindOnRespondedEventsOnly','false_true'],
['Calendar ID stripped for privacy','false'],['smsVerifiedFlag','true']]]]
Run Code Online (Sandbox Code Playgroud)
我认为这是为了防止人们eval()对它进行操作,但你真正需要做的就是更换while然后你就可以了.我认为eval预防是为了确保人们编写安全的JSON解析代码.
我已经在其他几个地方看到了这种情况,但谷歌(邮件,日历,通讯录等)的情况更是如此.奇怪的是,谷歌文档开始了&&&START&&&,谷歌联系人似乎开始while(1); &&&START&&&.
这里发生了什么?
我正在使用Backbone.js和Tornado Web服务器.在Backbone中接收集合数据的标准行为是作为JSON数组发送.
另一方面,由于以下漏洞,Tornado的标准行为是不允许使用JSON Array:
http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx
相关的一个是:http: //haacked.com/archive/2009/06/25/json-hijacking.aspx
当我真的是一个对象列表时,我不必在对象中包装我的JSON.
我无法在现代浏览器中重现这些攻击(即当前的Chrome,Firefox,Safari和IE9).与此同时,我无法确认现代浏览器解决这些问题的任何地方.
为了确保我既没有任何可能的糟糕的编程技能,也没有糟糕的谷歌搜索技能:
在现代浏览器中,这些JSON劫持攻击现在仍然是一个问题吗?
(注意:很抱歉可能重复:在现代浏览器上可以进行'JSON劫持'吗? 但由于接受的答案似乎没有回答这个问题 - 我认为现在是时候再问一遍并得到一些更明确的解释.)
在这个JS MDN页面上,它说:
JavaScript 1.8.1注意事项
从JavaScript 1.8.1开始,在对象和数组初始值设定项中设置属性时不再调用setter.
我只是无法弄清楚这是想告诉我的.