我知道这可能是一个新手问题,但我很好奇eval()
的主要好处 - 它最适合哪里使用?我很感激任何信息。
答案 0 :(得分:44)
最好使用eval
函数:从不。
它的目的是将字符串计算为Javascript表达式。例如:
eval('x = 42');
之前已经使用了很多,因为很多人不知道如何为他们想做的事情编写正确的代码。例如,为字段使用动态名称时:
eval('document.frm.'+frmName).value = text;
这样做的正确方法是:
document.frm[frmName].value = text;
由于eval
方法将字符串作为代码执行,因此每次使用该字符串都是某人在页面中注入有害代码的可能性。请参阅cross-site scripting。
eval
功能有一些合法用途。但是,你可能不会遇到真正需要它的情况。
答案 1 :(得分:30)
这是一个相当古老的问题,也许人们当时没有正确地考虑eval()
的用例。 eval()
的一个重要用途是将热重新加载实现到后端或前端开发流程中。
基本上eval()
可以让您在编辑器中编辑代码,并让它在没有重新启动的情况下修补正在运行的应用程序,并且不会丢失状态(取决于实现)。您将需要监视文件更改的相关代码,并以某种方式将更改发送到您的应用程序,但eval()
最终是将这些更改转换为实际js的方法。
修改的
我遇到的另一个用例:
您可以使用eval()
来绕过webpack的编译过程,在这些事件中您想要动态地要求您不想要编译的文件(例如json)例如:
const data = eval('require')(`./emails/${recipient}/${type}.json`)
在这方面,我认为写一个像eval()
这样的陈述是邪恶的,或者永远不应该被使用是完全错误的。 这样的毯子声明真是邪恶!
答案 2 :(得分:10)
eval
可以执行(或评估)一串javascript代码。
因此,当您希望某人执行一串javascript代码时,它是适用的。例如,在一篇关于JavaScript的教育文章中,读者可以立即尝试:)
或者,如果您的网站面向程序员,您可能希望他们编写并执行自己的插件。
答案 3 :(得分:7)
eval()
。
eval()
曾用于解析JSON字符串,但该用法已被更快,更安全JSON.parse
取代。
答案 4 :(得分:6)
使用eval的最佳目标是动态加载代码,在运行时生成代码并执行类似的元编程。通常,如果您可以在没有eval的情况下执行相同操作,请不要使用eval。
答案 5 :(得分:3)
您可以运行存储在网页上字段值中的JS。
你可以在eval中使用eval,这就是你的代码攻击更可行。只要它不使用AJAX,就没有服务器问题。
如果您使用eval,则应解析字符[()<> {}]
答案 6 :(得分:3)
eval() = evil
你根本不应该使用它。它可以用于简单的代码插入,但有人可以使用eval()
插入错误的脚本。有时人们使用eval()
来解析JSON或
eval("obj." + id); //newbies
但实际上你可以在不使用eval()
的情况下实现所有这些目标。
obj[id]; //should-do
答案 7 :(得分:2)
如前所述,使用eval()时可能存在潜在风险, 如果要将字符串评估为表达式,可以使用$ {}来评估ECMA-6中引入的表达式
答案 8 :(得分:1)
也许我错了,但我用它将经典字符串(从文件)转换为ES6
模板字符串:
let name = 'Daman'
let classicString = 'Hello ${name}'
let templateString = eval('`' + classicString + '`')
这正是我所需要的:
"Hello Daman"
答案 9 :(得分:1)
根据代表JavaScript代码的字符串动态运行代码。 例如:
let dynamicFunc = eval('(x)=>(x+2)') // or whatever plain text which is valid JS function
console.log(dynamicFunc(40));
// expected output: 42
安全警告!您应该始终验证这些字符串,以避免执行恶意脚本,尤其是在服务器端使用它时。
答案 10 :(得分:0)
使用eval的最佳用例之一是javascript logger,用户可以在运行时执行javascript。例如javascript logger允许用户在记录器窗口中执行脚本。
答案 11 :(得分:0)
你可以构建一个客户端框架并使其作为基础应用程序工作 - 接收代码包然后执行它们 - 从而使客户端非常灵活 - 在服务器上捆绑所有代码。 然而,这是非常危险的,如果需要这样的话,那么你应该使用Java和Java捆绑包。 为什么Eval仍然在语言中是有争议的,使用
是一个太大的安全风险答案 12 :(得分:0)
使用eval很有用,但是像其他所有东西一样,您必须意识到风险。每段JS代码都有潜在的风险。软件中的错误会通过逻辑错误和编码错误蔓延,而不会带来意想不到的后果。我总是说计算机永远不会做您想要他们做的事情,它们会执行您告诉他们要做的事情。这意味着您必须记住必须仔细考虑软件。软件没有改变。人们仍然在进行即时编码,而不是仔细的analasys和适当的设计。我们都在软件开发中犯了同样的罪过。使用eval-eval不是邪恶的,而是您所创造的。
答案 13 :(得分:-1)
Eval()
可能非常有用,即使据说它是“未完成”的。我在autoit
中使用它来启用基于代码的代码。
可以在编写代码处理器以创建自己的脚本时应用。
为什么?就我而言,在大型tcp服务器上使用它不需要我重新编译源代码并踢开所有客户端重新启动的原因。因此,我使用eval即时添加新脚本,这与配置工具不同,它不是静态的,可以用于计算等。另外,将eval与调用命令结合使用可以通过函数中的eval设置值。
但是除此之外,使用起来并不安全。即使以这种方式使用它,我也建议您确保它可以安全地失效。
答案 14 :(得分:-1)
永不言败。 Eval有很好的合法用例。它只是一个强大的工具,因此,如果您对如何使用它不认真,可能会造成严重的问题。
由于Javascript是在客户端执行的,因此安全风险在于客户端而不是服务器。如果您在javascript中使用eval,而又不小心验证eval函数的输入源或该输入的内容,那么您将对给客户端造成的潜在严重后果负责。
话虽如此,我对javascript eval的最佳使用是在编写各种类型的解析例程时。例如,将简单(或有时不太简单)的数学公式作为字符串存储在数据库中通常很方便。如果您的程序需要对由程序控制的变量执行任意计算,则eval是执行此操作的最佳方法。手动解析安全管理的字符串可能会不必要地复杂。
作为开发人员,我们无法完全控制客户端发生的情况。用户始终可以在控制台中自嘲,创建自己的问题,或者下载会干扰JS执行的浏览器扩展。我们最好的办法是限制风险敞口,不要疏忽大意,以免留下巨大的安全漏洞。