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

使用Function构造函数验证JavaScript语法是否安全?

问题:客户端验证JS代码有效性,用new Function()是否有安全风险?

我希望在客户端验证用户输入的代码是否为有效的JavaScript代码。引入JavaScript解析器(如Acorn或Esprima)属于相对较重的依赖。不过(若未启用CSP),我可以采用以下方式:

try {
    new Function(userCode);
    return {valid: true}
} catch (e) {
    return {
        valid: false,
        error: e.message
    };
}

虽然这里使用了new Function,但用户提供的代码从未被执行,仅被解析/编译。这种方式仍存在安全问题吗?


回答

这种方式确实存在不可忽视的安全风险,具体体现在以下几个方面:

1. 解析阶段的意外代码执行

你以为代码只被解析不执行,但部分特殊语法或引擎漏洞可能让解析过程触发代码运行。比如旧版浏览器的JS引擎中,恶意构造的正则表达式字面量可能在解析时就执行恶意逻辑;还有一些边界语法结构,可能让Function构造函数在预编译阶段意外触发代码片段。

2. 全局环境篡改风险

某些看似无害的代码,在解析过程中可能修改全局对象或原型链。比如:

Object.prototype.__proto__ = { /* 恶意修改 */ };

虽然这种情况比较极端,但在存在引擎漏洞的环境下,解析阶段就可能完成对环境的篡改,影响后续页面逻辑。

3. 资源耗尽攻击

攻击者可以提交超长、嵌套极深或者结构异常的JS代码,让new Function()在解析时占用大量CPU和内存,导致浏览器卡顿、假死甚至崩溃,属于典型的DoS攻击手段。

更安全的替代思路

如果担心解析器依赖体积,可以选择轻量版的解析器:比如Acorn的minified版本仅约10KB,完全可以接受;或者使用浏览器原生的Script标签配合type="module"来做沙箱解析,不过最稳妥的还是用成熟的解析库,避免自己踩安全坑。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 21:43:21