Possible Duplicate:
07000
我发现这种语法在Facebook上用于Ajax调用。我很困惑的for(;;);部分在响应的开始。它是干什么用的?
这是呼叫和响应:
GET http://0.131.channel.facebook.com/x/1476579705/51033089/false/p_1524926084=0
响应:
for (;;);{"t":"continue"}
为了面对这个挑战,Facebook最近一直在“全力”,内部项目旨在优雅地实施这些最佳实践,并且诚实地,唯一的解释,真正有意义的这个特定的情况只是:有人内部决定所有JSON解析应该在它们的核心库中执行一个单独的实现,最好的方法是对每个单独的API响应get(;;);自动粘在前面。
这样做,开发人员不能“懒惰”:他们会立即注意到,如果他们使用eval(),想知道是什么,然后实现他们的错误,并使用批准的JSON API。
提供的其他答案似乎都属于两个类别之一:
>误解JSONP,或
>误解“JSON劫持”。
第一类中的那些依赖于这样的想法,即攻击者可以以某种方式向不支持它的API请求“使用JSONP”。 JSONP是一个必须在服务器和客户端上支持的协议:它需要服务器返回类似于myFunction({“t”:“continue”})的东西,以便将结果传递给本地函数。你不能只是偶然使用JSONP。
第二类是引用一个非常真实的漏洞,已经描述了允许跨站点请求伪造通过标签到不使用JSONP(例如这一个)的API,允许一种形式的“JSON劫持”。这是通过更改Array / Object构造函数来实现的,它允许用户访问从服务器返回的信息,而不需要包装函数。
然而,这在这种情况下根本不可能:它的原因是一个裸数组(许多JSON API的一个可能的结果,如着名的Gmail示例)是一个有效的表达式语句,这不是真的裸对象。
实际上,由JSON定义的对象的语法(其中包括字段名称周围的引号,如本示例所示)与块的语法冲突,因此无法在脚本的顶级使用。
js> {"t":"continue"} typein:2: SyntaxError: invalid label: typein:2: {"t":"continue"} typein:2: ....^
对于可以通过Object()构造函数重映射来利用的这个例子,它将要求API返回一组括号内的对象,使其成为有效的JavaScript(但不是有效的JSON)。
js> ({"t":"continue"}) [object Object]
现在,它可能是这样的(;;);前缀特技只是“偶然”显示在这个例子中,实际上是由返回数组的其他内部Facebook API返回;但在这种情况下,应该真正地注意到,因为那将是“真正的”原因为什么for(;;);出现在此特定代码段中。