我想验证(客户端)用户是否输入了有效的 JavaScript 代码。
引入 Javascript 解析器(例如 Acorn 或 Esprima)是一个相对较重的依赖项。但是(如果未启用 CSP),我可以这样做:
try {
new Function(userCode);
return {valid: true}
} catch (e) {
return {
valid: false,
error: e.message
};
}
虽然这确实使用了
new Function
,但用户提供的代码永远不会 run,而只会被解析/编译。还存在安全问题吗?
这看起来不错。解析/编译 JS 代码是安全的,没有副作用(模块解析和加载不适用于
Function
)。我们可以肯定,现代浏览器中使用的 JavaScript 解析器几乎没有错误。