一尘不染

jQuery使用(new Function(“ return” + data))(); 代替eval(data); 解析JSON,为什么呢?

json

此链接显示jQuery (new Function("return " + data))();用于较旧的浏览器,而不是解析JSON字符串eval()

这有什么好处?如果JSON字符串 不安全 怎么办?


阅读 496

收藏
2020-07-27

共1个答案

一尘不染

尼克答案中的引言暗示了这一点。并没有太大的区别,但是感觉是eval比还要“差” new Function。不是安全性方面的-
面对不受信任的输入,它们都同样无用,但是希望您的Web应用程序不会返回不受信任的JSON字符串-而是基于语言级别的怪异,从而阻止了优化。

特别:

function victim() {
    var a= 1;
    eval('a= 2');
    return a;
}

2。该eval编辑字符串已在运行victim的局部变量的范围内!这是常规的用户编写函数永远无法完成的;eval只能这样做,因为它是黑魔法。

相反,使用常规函数可以消除此魔术元素:

function victim() {
    var a= 1;
    (new Function('a= 2;'))();
    return a;
}

在上面,返回的a遗骸1;新函数只能对自己的局部变量或全局变量进行操作window.a

有了这些知识,代码分析工具(可能包括JavaScript引擎,尤其是聪明的缩小器)可以进行更多优化。例如,第二个victim函数可以将a变量完全优化为return 1。一种用途eval和许多潜在的优化措施将不可行。

当然在实践中,对于像JSONer这样的小功能eval,不会有明显的区别,但是总的来说,思路是:

  • 尽可能避免使用两种方法(ECMAScript Fifth Edition的严格模式均禁止使用这两种方法);
  • 除非您确实需要代码来访问调用函数的局部变量,否则new Function最好使用,而eval不是。
2020-07-27