优先使用Function构造函数替代eval执行动态代码,因其运行在独立作用域中更安全;应严格校验输入来源与内容,仅允许白名单内的表达式;推荐通过配置对象、预定义函数或沙箱环境等更安全方案替代动态执行。

在JavaScript中,执行动态生成的代码字符串存在安全风险,尤其是当代码来源不可信时。如果必须执行,应优先选择更安全的替代方案,实在无法避免时再考虑有限制地使用。
eval() 是最直接但最危险的方式,它会在当前作用域中执行字符串代码,可能访问和修改局部变量,造成注入攻击。
不推荐:const userInput = "alert('xss');";
eval(userInput); // 危险!Function 构造函数创建的函数运行在独立的作用域中,默认无法访问外部变量,比 eval() 更安全。
推荐方式:const code = "return 2 + 3;"; const result = new Function(code)(); console.log(result); // 5
若需传参,可指定参数名:
立即学习“Java免费学习笔记(深入)”;
const multiply = new Function('a', 'b', 'return a * b;');
console.log(multiply(2, 3)); // 6这种方式不会污染或读取调用者作用域,降低风险。
即便使用 Function,也应确保代码字符串来自可信来源。对用户输入应进行白名单校验,只允许特定格式或表达式。
例如:仅允许数学表达式,可用正则简单过滤:
function safeEval(expr) {
if (!/^[0-9+\-*/().\s]+$/.test(expr)) {
throw new Error("仅允许数字和基本运算符");
}
return new Function(`return ${expr};`)();
}
safeEval("2 + 3 * 4"); // 14注意:正则不能完全防止复杂攻击,仅适用于受控场景。
大多数情况下,执行动态代码可通过其他方式实现:
基本上就这些。能不用动态执行就不用,迫不得已时用 Function 并严控输入,是最实际的做法。
以上就是在JavaScript中,如何安全地执行动态生成的代码字符串?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号