代码之家  ›  专栏  ›  技术社区  ›  flavian

JSON/JSONP如何使用for(;;);在呼吸的身体里

  •  1
  • flavian  · 技术社区  · 12 年前

    我似乎想不出一种方法来忽略 for(;;); 在我的跨域JSONP请求的响应主体中。我在自己的服务器上做这件事,这里没有其他事情。我试着把它包括在内 用于(;;); 在我的回调的响应体中,如下所示:

    _callbacks_.callback(for(;;);[jsondata....]);
    

    但是如何在解析JS代码之前将其从响应体中删除呢?顺便说一句,我正在使用谷歌闭包库。

    1 回复  |  直到 12 年前
        1
  •  1
  •   flavian    12 年前

    好吧,我想我想通了。 为(;;);是为了防止某些信息的跨域数据请求。因此,基本上,如果您有要保护的信息,您可以通过一个普通的Ajax JSON通道,如果您在多个服务器上存储数据,您可以在服务器级别处理它。

    JSONP请求实际上是一个远程脚本包含,这意味着无论服务器输出什么都是实际的Javascript代码,所以如果您有 for(;;); 在你的 _callbacks_.callback(); 一旦请求成功,代码将在源域上执行。如果它是一个无限for循环,它显然会阻塞页面。

    因此,通常的实现方法如下:

    1. 向位于同一服务器上的文件发送一个普通的Ajax请求。
    2. 执行服务器级别的工作,并通过加密的CURL向外部服务器发送请求。
    3. 为服务器响应添加安全性(a 用于(;;); while(1); throw(1); 然后是 <prevent eval statements> 一串
    4. 获取作为文本字符串的响应。
    5. 从字符串中删除您的安全实现。 使用标准JSON解析器将字符串(现在是“JSON字符串”)转换为JS Object/Array等。
    6. 对数据做任何你想做的事情。

    我只是觉得我应该把这个放在这里,以防将来有人用谷歌搜索它,因为我没有通过谷歌搜索找到合适的信息。这应该有助于防止跨域请求伪造。