gpt4 book ai didi

javascript - jQuery 使用 (new Function ("return "+ data))();而不是 eval(数据);解析JSON,为什么?

转载 作者:行者123 更新时间:2023-12-03 21:53:17 26 4
gpt4 key购买 nike

This link向您展示 jQuery 使用 (new Function("return " + data))();对于较旧的浏览器,解析 JSON 字符串而不是 eval() .

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

最佳答案

尼克回答中的引用暗示了这一点。这并不是一个很大的区别,但感觉evalnew Function“更差”。不是在安全性方面——“它们在面对不受信任的输入时同样无用,但希望您的 Web 应用程序不会返回不受信任的 JSON 字符串”——“而是在语言级别的怪异性方面,因此对优化产生阻力。

具体:

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

给出2eval​ed 字符串已在 victim 的局部变量作用域上进行操作!这是普通用户编写的函数永远无法做到的; eval 只能做到这一点,因为它是黑魔法。

使用常规函数会消除这种魔力:

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

上面返回的a仍然是1;新函数只能操作它自己的局部变量或全局window.a

这些知识允许代码分析工具——“可能包括 JavaScript 引擎和特别聪明的缩小器”——应用更多的优化。例如,第二个 victim 函数可以将 a 变量完全优化为 return 1。一次使用 eval 和大量潜在的优化是不可行的。

当然,在实践中,对于像 JSON eval​er 这样的小函数,不会有明显的差异,但总的来说,想法是:

  • 尽可能避免这两种方法(ECMAScript 第五版的严格模式中均不允许使用这两种方法);
  • 如果必须使用一个,new Functioneval 更好,除非您确实需要代码来访问调用函数的局部变量。

关于javascript - jQuery 使用 (new Function ("return "+ data))();而不是 eval(数据);解析JSON,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2449220/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com