使用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
相关产品推荐
相关产品推荐

