为什么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&&&.
这里发生了什么?
Google会像这样返回json:
throw 1; <dont be evil> { foo: bar}
Run Code Online (Sandbox Code Playgroud)
和Facebooks ajax有这样的json:
for(;;); {"error":0,"errorSummary": ""}
Run Code Online (Sandbox Code Playgroud)
作为对安全目的的回应:
如果刮刀位于另一个域上,则必须使用script标记来获取数据,因为XHR不会跨域工作.即使没有for(;;);攻击者如何获取数据?它没有分配给变量,所以它不会被垃圾收集,因为它没有引用它?
基本上,为了获得数据跨域,他们必须这样做
<script src="http://target.com/json.js"></script>
Run Code Online (Sandbox Code Playgroud)
但即使没有崩溃脚本,攻击者也不能使用任何Json数据而不将其分配给您可以全局访问的变量(在这些情况下不是这样).崩溃代码没有任何效果,因为即使没有它,他们也必须使用服务器端脚本来使用其站点上的数据.
我已经实现了一个简单的GWT应用程序,它具有登录服务(LoginService)和工作服务(WorkerService).两者都是GWT-RPC.我通过实现GWT最新的XsrfProtectedServiceServlet来保护所有针对XSRF的服务(请参阅GWT Xsrf-Safe Sample Projetct).
实现此示例,会在页面加载时在JSP文件中创建会话标识.在这种情况下,即使用户没有登录.
这是正确的方法吗?或者我是否必须在LoginService中创建会话ID(设置cookie)?但是当以这种方式实现时,LoginService本身是否容易受到XSRF攻击?
谢谢,帕斯卡尔
可能重复:
为什么在XmlHttpRequest响应中有"while(1);"?
Gmail中的while(1)有什么作用
我最近偶然发现了预先添加AJAX返回数据的做法,while (1==1) {}以便为CSRF攻击提供更高的安全性,但我没有看到该代码如何有用.有人可以解释一下吗?