JavaScript中用new Function替代eval()能否通过安全扫描测试?
问题解答
安全扫描提示的核心风险是在攻击者可控的字符串上执行动态代码,你把eval替换为new Function的修改无法彻底解决这个安全问题,原因如下:
核心风险未消除
不管是eval还是new Function,本质都是动态执行拼接出来的代码字符串。如果format参数能被攻击者篡改(比如来自用户输入、URL参数等不可信来源),攻击者依然可以构造恶意格式字符串,通过你的代码拼接逻辑注入恶意代码并最终执行。
两者仅在作用域上有区别:
eval会在当前函数作用域内执行代码new Function会在全局作用域执行代码
但这都改变不了“动态执行不可信代码”的本质,安全扫描指向的核心风险点依然存在。
原有代码(含eval)
Date.createNewFormat = function(format) { console.log('format 22', format) var funcName = "format" + Date.formatFunctions.count++; Date.formatFunctions[format] = funcName; var code = "Date.prototype." + funcName + " = function() {return "; var special = false; var ch = ""; for (var i = 0; i < format.length; ++i) { ch = format.charAt(i); if (!special && ch == "\\") { special = true; } else { if (special) { special = false; code += "'" + String.escape(ch) + "' + "; } else { code += Date.getFormatCode(ch); } } } eval(code.substring(0, code.length - 3) + ";}"); }
修改后的代码(含new Function)
var runFunction = new Function(code.substring(0, code.length - 3) + ";}"); runFunction();
真正的解决方案
要彻底解决问题,需要避免动态生成并执行代码,改用静态解析的方式处理日期格式:
- 遍历
format字符串的每个字符 - 遇到格式化占位符(如
yyyy、MM等)时,调用对应日期方法获取值 - 遇到普通字符直接拼接
- 最终返回拼接好的日期字符串,全程不生成任何可执行代码字符串
内容的提问来源于stack exchange,提问作者user15170399
相关产品推荐
相关产品推荐

