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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 14:45:03