什么是Ajax调用响应像’for(;;); {json data}’是什么意思?

前端之家收集整理的这篇文章主要介绍了什么是Ajax调用响应像’for(;;); {json data}’是什么意思?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

Possible Duplicate:
07000

我发现这种语法在Facebook上用于Ajax调用。我很困惑的for(;;);部分在响应的开始。它是干什么用的?

这是呼叫和响应:

GET http://0.131.channel.facebook.com/x/1476579705/51033089/false/p_1524926084=0

响应:

for (;;);{"t":"continue"}
Facebook有大量的开发人员在内部工作在很多项目,这是非常常见的人犯一个小错误;无论是简单和严重,如失败的数据插入到一个HTML或sql模板或一些复杂和微妙的使用eval(有时是低效和可疑的不安全)或JSON.parse(一个兼容但不是普遍实现的扩展)的“已知良好”JSON解码器,重要的是找出方法来轻松实施这个开发人员的最佳实践。

为了面对这个挑战,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(;;);出现在此特定代码段中。

原文链接:https://www.f2er.com/ajax/161261.html

猜你在找的Ajax相关文章