You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

eval与Function构造函数安全对比:第三方代码访问作用域的含义及影响

为什么Function构造函数是eval的更优安全替代?

让我把这个问题拆解清楚,核心差异就在作用域访问权限上——这也是两者安全风险天差地别的原因。

具体含义:作用域的隔离性差异

eval()的本质是直接在当前调用它的作用域里执行代码,相当于把字符串里的代码直接嵌到当前位置运行。而Function()构造函数创建的函数,不管你在哪个作用域调用它,它的执行上下文都是全局作用域,完全访问不到调用它的局部作用域里的变量、函数。

举个直观的代码例子就能明白:

function handleSensitiveInfo() {
  const userToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."; // 局部敏感数据
  const secretApiKey = "sk_abc123xyz789";

  // 用eval执行不可信代码的情况
  eval('console.log("eval拿到的token:", userToken)'); 
  // 输出:eval拿到的token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

  // 用Function构造函数执行同样代码的情况
  const untrustedFunc = new Function('console.log("Function拿到的token:", userToken)');
  untrustedFunc(); 
  // 抛出错误:ReferenceError: userToken is not defined
}
handleSensitiveInfo();

第三方代码如果通过eval执行,就像直接钻进了你的局部作用域,可以随意读取、修改里面的所有数据和函数;而用Function的话,恶意代码被关在全局作用域这个“笼子”里,碰不到你藏在局部的敏感信息。

对JavaScript应用安全的实际影响

  • 数据泄露风险大幅降低
    如果你用eval处理了不可信的字符串(比如用户输入、第三方接口返回的可疑内容),恶意代码可以直接窃取局部作用域里的用户密码、会话token、内部配置等敏感数据,直接导致用户信息泄露或系统核心数据被盗。而Function做不到这一点,局部数据始终安全。

  • 代码篡改的危害范围缩小
    eval执行的恶意代码可以直接修改当前作用域的函数和变量——比如篡改你的支付计算逻辑、偷偷替换用户权限校验函数,让恶意操作绕过校验。Function只能修改全局作用域的内容,影响范围可控,而且全局变量的敏感程度通常远低于局部作用域。

  • 权限提升风险被限制
    如果你的局部作用域里有一些高权限的内部函数(比如修改用户等级、删除数据的方法),eval执行的恶意代码可以直接调用这些方法,而Function因为访问不到局部作用域,根本没机会触发这些危险操作。

补充提醒

虽然Function比eval安全,但它绝不是“绝对安全”的——如果传入Function的字符串是不可信的,它依然能在全局作用域搞破坏(比如添加恶意全局函数、修改全局配置)。所以最佳实践是:尽量避免使用eval和Function处理不可信代码,如果必须动态执行代码,优先考虑更安全的方案(比如用沙箱环境、预编译模板等)。

内容的提问来源于stack exchange,提问作者Shnick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:17:23