当前位置: 首页 > 面试题库 >

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

岳正阳
2023-03-14
问题内容

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

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


问题答案:

尼克答案中的引言暗示了这一点。并没有太大的区别,但是感觉是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不是。


 类似资料:
  • 问题内容: 快速提问。JavaScript中的Eval是不安全的吗?我有一个JSON对象作为字符串,我需要将其转换为实际对象,以便获取数据: 如果有帮助,我正在使用jQuery的$ .ajax方法。 谢谢 问题答案: 好吧,不管是否安全,当您使用jQuery时,最好使用$ .getJSON() 方法,而不是$ .ajax(): 当您仅与自己的服务器通信时,通常被认为是安全的JSON解析,尤其是当您

  • 问题内容: 据我所知,由于安全性,在JavaScript中使用JSON对象被认为是不好的做法。如果JSON来自其他服务器,我可以理解此问题。 但是,如果JSON是由我自己的服务器提供的,并且是使用PHP创建的(我们假设它不是越野车),那么简单地使用JS中的JSON读取是否合法,或者我目前无法想到任何安全问题? ? 我真的不想处理动态加载JSON解析器的问题,因此很高兴使用。 PS:很明显,我将使用

  • In some cases, we might want to return data from a new screen. For example, say we push a new screen that presents two options to a user. When the user taps on an option, we’ll want to inform our firs

  • In some cases, we might want to return data from a new screen. For example, say we push a new screen that presents two options to a user. When the user taps on an option, we’ll want to inform our firs

  • 本文向大家介绍bootstrap data与jquery .data,包括了bootstrap data与jquery .data的使用技巧和注意事项,需要的朋友参考一下 jquery官网对.data函数描述是:在匹配元素上存储任意相关数据 或 返回匹配的元素集合中的第一个元素的给定名称的数据存储的值。 存储键值(key/value):     取键值   以上这些都很容易掌握和理解,今天在看bo

  • eval 函数会在当前作用域中执行一段 JavaScript 代码字符串。 var foo = 1; function test() { var foo = 2; eval('foo = 3'); return foo; } test(); // 3 foo; // 1 但是 eval 只在被直接调用并且调用函数就是 eval 本身时,才在当前作用域中执行。 var fo