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

使用new Function()结合模板字符串是否存在安全风险?安全工具会标记吗?

嘿,你的这个实现在完全可控的场景下确实没啥大问题,但安全风险的核心其实取决于myString的来源——咱们一步步说:

安全风险拆解
  • 如果myString是你自己硬编码的固定内容:比如你例子里的"${hello}",那真的不用担心安全问题。你提到的严格模式限制是对的,这个new Function只能访问你明确传入的hello参数,模板字符串里的表达式也只能用这个参数,不会有机会执行恶意代码。
  • 如果myString来自不可信的外部输入:那风险瞬间就来了!比如攻击者把myString改成"${(function(){ /* 偷取用户数据或者执行恶意操作的代码 */ })()}",甚至更隐蔽的注入,那new Function执行的时候就会直接运行这段恶意JS,轻则触发XSS攻击,重则泄露敏感数据。毕竟模板字符串里的表达式是会被求值执行的,一旦被注入恶意代码,就相当于直接在页面里跑了攻击者的脚本。
安全工具的检测逻辑

像npm audit、GitHub的安全扫描工具这类,不会平白无故把new Function的使用标记为风险——但如果你的代码里存在「外部输入直接拼接进new Function的字符串参数」这种情况,静态代码分析工具(比如ESLint的no-new-func规则,或者专业的SAST工具)会把它标记为代码注入风险点。因为new Function本质和eval类似,属于动态执行代码的写法,这类写法本身就属于安全扫描里的“潜在危险操作”,尤其是当输入不可控的时候,很容易被盯上。

额外建议

如果你的场景里myString有可能来自外部(比如用户输入、后端返回的动态模板),建议换一种更安全的模板替换方式,比如纯字符串匹配替换,完全不执行代码:

function renderSafeTemplate(template, data) {
  // 只替换${变量名}格式的占位符,不执行任何代码
  return template.replace(/\${(\w+)}/g, (_, key) => data[key] || '');
}

var myString = "${hello}";
document.getElementById("tdiv").innerHTML = renderSafeTemplate(myString, { hello: "whassup" });

这种方式就彻底规避了代码注入的风险,安全性高得多。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:31:27