【问题标题】:What's the main benefit of using eval() in JavaScript?在 JavaScript 中使用 eval() 的主要好处是什么?
【发布时间】:2012-05-15 12:02:48
【问题描述】:

我知道这可能是一个新手问题,但我很好奇 eval() 的主要好处 - 它最好用在哪里?我很感激任何信息。

【问题讨论】:

  • 为什么这个标签是homework
  • @Adel,我知道这有点太晚了,但我刚刚找到了一种使用eval的完美方式...:stackoverflow.com/a/10508240/283863
  • Eval 可以帮助您在某些情况下提高性能。我不确定浏览器在 2012 年的情况如何,但如今浏览器控制台可能是破解数据的最佳易受攻击场所。
  • 只是想添加这个。如果您决定使用 eval,请阅读此内容。 Eval 有一些安全问题,有一些方法可以克服它,一种方法是使用 safe-eval,但它会带来额外的性能开销。您可以阅读关于 eval 是如何易受攻击的以及它与 safe-eval 的性能比较,这里有示例和统计信息ayushchaurasia96.medium.com/…

标签: javascript eval


【解决方案1】:

最好使用eval 函数:从不。

它的目的是将字符串评估为 Javascript 表达式。示例:

eval('x = 42');

它以前用过很多次,因为很多人不知道如何为他们想做的事情编写正确的代码。例如,当为字段使用动态名称时:

eval('document.frm.'+frmName).value = text;

正确的做法是:

document.frm[frmName].value = text;

由于eval 方法将字符串作为代码执行,因此每次使用它都有可能让某人在页面中注入有害代码。见cross-site scripting

eval 函数有一些合法用途。但是,您不太可能会遇到真正需要它的情况。

【讨论】:

  • 我在网页上有一个示例代码块,用户可以运行它。这是应该使用 eval 的情况还是有更好的选择?
  • 您不会eval() 来编排XSS。因此,避免使用eval() 会使代码不比使用它更安全。它是关于验证(过滤)用户输入,而不是关于eval()alert()javascript: 等。
  • 我不同意,在某些情况下,例如,如果您有一个带有 hfref 属性的 ASP.Net 服务器端 LinkBut​​ton,如下所示:href="javascript:__doPostBack('sfw$fc$fccd$e8$dui10$btnLinkUse','')" 并且您需要通过代码触发点击,您可以'不要使用$("#").click() 甚至$("#").trigger("click"),你必须使用eval($("#").attr("href"))
  • 有时您需要 eval 函数,而其他解决方案无法使用。因此,对于 eval 函数的使用说“从不”是不合适的。知道如何保管刀具很重要。
【解决方案2】:

这是一个相当古老的问题,也许人们当时没有正确考虑eval() 的用例。 eval() 的一大用途是在您的后端或前端开发流程中实现热重载

基本上eval() 可以让您在编辑器中编辑代码,并在不重新启动和不丢失状态的情况下修补正在运行的应用程序(取决于实现)。您将需要相关代码来监视文件更改,并以某种方式将更改发送到您的应用程序,但 eval() 最终是将这些更改转换为实际 js 的方法。

编辑

我遇到的另一个用例:

你可以使用eval()绕过webpack的编译过程,在你想要动态地需要你不想被转译的文件(比如json)的事件中例如:

const data = eval('require')(`./emails/${recipient}/${type}.json`)

关于这一点,我认为写像eval() 这样的声明是邪恶的,或者永远不应该使用是完全错误的。 像这样的笼统声明才是真正的邪恶!

【讨论】:

  • 这是我遇到的最好的和真实的用例。 (y)
  • 简洁的答案。如果有人正在构建类似 ReactJS 或 Angular 或 NodeJS 的东西,这个答案会很有用。 =)
  • 在所有答案中,这是唯一一个有实际内容的答案。 有有效的用例,哪些?。 永远不要使用它! 为什么eval 存在呢?很好的答案!
  • 非常感谢,我在使用 evalrequire 组合时遇到了问题,但这个设置帮助了我。
【解决方案3】:

eval 可以执行(或评估)一串 javascript 代码。

因此,当您希望某人执行一串javascript代码时,它是适用的。例如,在一篇关于 JavaScript 的教育文章下,读者可以立即尝试:)

或者,如果您的网站面向程序员,您可能希望他们编写和执行自己的插件。

【讨论】:

    【解决方案4】:

    使用 eval 的最佳目标是动态加载代码、在运行时生成代码以及执行类似的元编程工作。一般来说,如果不用 eval 也能做同样的事情,请不要使用 eval。

    【讨论】:

      【解决方案5】:

      eval() 不应在 Javascript 中使用。

      eval() 曾经用于解析 JSON 字符串,但该用途已被更快、更安全的 JSON.parse 所取代。

      【讨论】:

      • 啊,我明白了 - 所以这是一个有风险的功能 - 我会阅读更多。谢谢,
      • @Guffa:是的,但不应该这样。
      • JSON解析函数为JSON.parse
      • “eval() 不应在 Javascript 中使用。”。我不同意。应小心使用。如果它不应该被使用,那么它不应该是语言的一部分
      • @peter:JavaScript 中有很多东西不应该成为该语言的一部分(最值得注意的是,with())。
      【解决方案6】:

      您根本不应该真正使用它。它可以用于简单的代码插入,但有人可以使用eval() 插入错误的脚本。有时人们使用eval() 来解析JSON,或者

      eval("obj." + id);   //newbies
      

      但实际上您可以在不使用eval() 的情况下实现所有这些目标。

      obj[id];             //should-do
      

      【讨论】:

      • 我们都知道你不应该使用eval; OP 在询问是否有任何好处。
      • @JeffreySweeney - (我想不出他们中的任何一个......)
      • 我知道对吗? :P 也许它可以用于在测试服务器上测试后端漏洞,或者用于速度测试(因为它是 JS 中最慢的功能之一)。
      • 你真的这么想吗?我经常感受到来自编程社区的某种偏见。如果有什么东西很糟糕并且被权威文章劝阻,即使在少数情况下它确实适用并且很好,人们也会停止使用它。
      • @Imp 执行代码可以简单方便,但也会让一些不良用户插入恶意脚本。 (根据谷歌)
      【解决方案7】:

      你可以运行网页上某个字段值中存储的JS。

      您可以将 eval 与 JS 一起使用,只是这样您的代码更容易受到攻击。只要不使用AJAX,就没有服务器问题。

      如果你使用eval,你应该解析出字符[(){}]

      【讨论】:

      • 这通常是个糟糕的主意。
      • JS 库一直提倡这样做,所以这一定是个好习惯!
      • 不生吃也不错
      • @PitaJ - “Schabse Laks,开发人员,C# MVP - Microsoft 最有价值的专业人士”
      • @Derek- 太棒了。我在高中。
      【解决方案8】:

      如前所述,使用 eval() 时存在潜在风险, 如果您想将字符串评估为表达式,您可以使用 ${} 来评估表达式,在 ECMA-6 中引入

      【讨论】:

        【解决方案9】:

        也许我错了,但我正在使用它来解析模板文件中的字符串:

        const name = 'Daman'
        const fileContent = 'Hello ${name}'
        const result = eval('`' + fileContent + '`')
        

        这正是我所需要的:

        "Hello Daman"
        

        【讨论】:

          【解决方案10】:

          使用 eval 的最佳用例之一是 javascript 记录器,用户可以在其中执行 javascript 在运行时。例如javascript logger 允许用户在记录器窗口中执行脚本。

          【讨论】:

            【解决方案11】:

            根据代表 javascript 代码的字符串动态运行代码。 例如:

            let dynamicFunc = eval('(x)=>(x+2)') // or whatever plain text which is valid JS function
            console.log(dynamicFunc(40));
            // expected output: 42
            

            安全警告!您应该始终验证这些字符串以避免恶意脚本执行,尤其是在服务器端使用它时。

            【讨论】:

              【解决方案12】:

              您可以构建客户端框架并将其用作基础应用程序 - 接收代码包然后执行它们 - 从而使客户端非常灵活 - 将服务器上的所有代码打包。 然而,这是非常危险的,如果需要这样的事情,那么您也许应该将 Java 与 Java 捆绑包一起使用。 为什么 Eval 仍然使用该语言是有争议的,使用它的安全风险太大

              【讨论】:

                【解决方案13】:

                使用 eval 很有用,但与其他一切一样,您必须注意风险。每一段 JS 代码都是潜在的风险。软件中的错误会通过逻辑错误和编码错误潜入,并带来意想不到的后果。我总是说计算机永远不会做你想让他们做的事情,他们会做你告诉他们做的事情。这意味着您必须记住,必须仔细考虑软件。软件没变。人们仍然在动态编码,而不是仔细分析和适当的设计。在软件开发中,我们都犯了同样的罪。使用 eval - eval 不是邪恶的,它是你做出来的。

                【讨论】:

                  【解决方案14】:

                  永远不要说永远。 Eval 有很好的合法用例。它只是一个强大的工具,所以如果你不认真地使用它,你可能会产生一个严重的问题。

                  由于 Javascript 是在客户端执行的,因此安全风险在于客户端而不是服务器。如果您在 javascript 中使用 eval 并且不小心验证 eval 函数的输入源或该输入的内容,您将对客户端可能造成的严重后果负责。

                  话虽如此,我对 javascript eval 的最佳使用是在编写各种类型的解析例程时。例如,将简单(或有时不那么简单)的数学公式作为存储在数据库中的字符串放入数据中通常很方便。如果您的程序需要对由程序控制的变量执行任意计算,那么 eval 是最好的方法。手动解析安全管理的字符串可能会变得不必要的复杂。

                  作为开发人员,我们无法完全控制客户端发生的事情。用户总是可以在控制台中捣乱并创建自己的问题,或者下载干扰 JS 执行的浏览器扩展。我们能做的最好的事情就是限制风险敞口,不要疏忽大意,留下巨大的安全漏洞。

                  【讨论】:

                    【解决方案15】:

                    Eval() 可能非常有用,即使它被称为“撤消”。我在autoit 中使用它来启用代码上的代码。

                    它可以在编写代码处理器以创建自己的脚本时应用。

                    为什么? 在我的情况下,在大型 tcp 服务器上使用它不需要我重新编译源代码并踢掉所有客户端导致重新启动。因此,我使用 eval 动态添加新脚本,这与配置文件不同,它不是静态的,可用于计算等。还将 eval 与调用命令结合起来可以通过函数的 eval 设置值。

                    但除此之外,使用起来也不太安全。即使以这种方式使用它,我也建议确保它不会发生故障。

                    【讨论】:

                      猜你喜欢
                      • 2017-07-18
                      • 2012-06-13
                      • 1970-01-01
                      • 1970-01-01
                      • 2013-03-30
                      • 1970-01-01
                      • 2013-03-21
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多