使用“新函数”验证 JS 语法

Using `new Function` to validate JS syntax

提问人:cloudfeet 提问时间:10/13/2023 更新时间:10/16/2023 访问量:69

问:

我想验证(客户端)用户是否输入了有效的 JavaScript 代码。

引入 Javascript 解析器(例如 Acorn 或 Esprima)是一个相对较重的依赖。但是(如果未启用 CSP),我可以执行以下操作:

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

虽然这确实使用 ,但用户提供的代码从不运行,只进行解析/编译。是否仍然存在安全问题?new Function

JavaScript 安全 评估客户端

评论

1赞 Barmar 10/13/2023
我认为这是安全的。仅定义函数不会执行代码。
0赞 VLAZ 10/14/2023
@Konradnew Function(`const fn = new Function("1ee")`)
0赞 Timur 10/14/2023
谢谢你纠正我@Konrad,你是对的。我将编辑我的评论。这不会检查是否在所有情况下都是有效的 JS。@VLAZ补充了一个很好的例子。userCode
0赞 cloudfeet 10/14/2023
@Barmar这也是我的直觉,但 JS 有一些奇怪的角落(这会导致污染和我意想不到的东西),所以 🤷__proto__
0赞 cloudfeet 10/14/2023
@VLAZ就我而言,这将被视为有效的 JS,它只会在运行时抛出。 对我的情况也有效。new Function("throw Error()")

答:

2赞 Bergi 10/16/2023 #1

这似乎很好。解析/编译 JS 代码是安全的,并且没有副作用(模块解析和加载不适用于 )。我们可以肯定,现代浏览器中使用的 JavaScript 解析器完全没有错误。Function