使用 new Function 是否被视为安全风险?

3

我有一个函数可以帮助我创建临时对象,节省打字时间。

附加编辑:为了澄清,这个函数只会存在于匿名函数中。

(function(){ // clarification of the functions location
var objectPump = function (props, defaults){
    var str;
    if(typeof defaults === "string"){
        defaults = defaults.split(",");
    }else    
    if(typeof defaults === "undefined" ||  !defaults.isArray){        
        defaults =[];
    }
    if(props !== undefined){
        if(typeof props === "string"){
           props = props.split(",");
        }
    }else{
        throw new TypeError("No properties defined for objectPump.");
    }
    // create function body
    str = "var obj={};";
    props.each( function(p,i) {  
        str += "obj." + p + "=";
        if (typeof defaults[i] === "string") {
            str += p + "===undefined?" + '"' + defaults[i] + '":';
        } else
        if (typeof defaults[i] === "number") {
            str += p + "===undefined?" + defaults[i] + ":";
        }
        str += p + ";";  
    });
    str += "return obj;";
    str = "return new Function('" + props.join("','") + "','" + str + "')";
    // Uses new Function to create the new function
    return  (new Function(str))();  // Is this dangerous???        
}
})();  // wrapped in an anon function

这使我可以创建对象,而不必在默认值中命名所有属性和代码。

编辑:使用上述函数。

var car = objectPump("colour,year,type", // objects property names
                     "white,2015,All Wheel Drive"); // object defaults
// or as arrays
var car = objectPump(["colour","year","type"], // objects property names
                     ["white",2015,"All Wheel Drive"]); // object defaults
var cars = [
    car("red",2011), // missing property defaults to All Wheel Drive
    car("blue",2015,"bike"),
];
var aCar =   car("blue",2015,"bike");
// same as
var aCar = {
    colour:"blue",
    year:2015,
    type:"bike"
};  // but saves me having to type out the property names for each new object

对我来说,这看起来很像使用eval并且第三方黑客可以注入一些恶意代码。到目前为止,它非常方便,我很想在其他任务中使用new Function

我应该使用new Function()来生成代码吗?对于公共代码来说,它是否被认为是不好的和/或危险的?


你能展示一下如何使用这个工具吗?new Function可能并不是必要的。(而且这也是一个不好的实践,但目前看起来似乎没有任何漏洞...但如果没有上下文很难说。) - Ry-
在编辑中增加了使用方法。 - Blindman67
你的实现方式有点复杂。按照“正常”的方式来做会更简洁,而且不需要使用 eval 或 new Function - JJJ
@Blindman67 我的意思是你可以创建一个工厂并具有完全相同的功能。试试这个:http://jsfiddle.net/kk0rzqso/ - JJJ
@Justus Romijn 整个应用程序都在匿名函数内部。 - Blindman67
显示剩余3条评论
1个回答

1
var car = objectPump("colour,script", // objects property names
        "white,\" + alert(\"test\") + \""); // object defaults

console.log(new car('blue, but the nice one')); // throws alert 

你的意思是这样很危险吗?

说实话,我不太喜欢objectPump函数。你还有其他可行的选择:

编辑:函数objectPump不会给攻击者任何优势。1)如果攻击者可以修改您的JS文件,那么她将立即使用eval,并且不需要任何objectPump。2)如果您从用户处对所有输入进行了消毒处理,则这里没有问题。

我主要担心的是最终会伤及自己而不是攻击者。


但是如果我在 (function(){ var objectPump= function(){...}; })() 中有 objectPump,他们如何访问该函数以添加恶意代码。这就是我不理解的地方。 - Blindman67
1
函数objectPump不会给攻击者带来任何优势。1)如果攻击者可以修改您的JS文件,那么她将立即使用eval,并且不需要任何objectPump。2)如果您对用户的所有输入进行了消毒处理,则这里没有问题。我在这里的主要关注点是,您最终可能会自食其果,而不是攻击者。 - MartyIX
жүҖд»ҘдҪ зҡ„ж„ҸжҖқжҳҜеҸӘиҰҒжҲ‘е°Ҷnew Functionж”ҫеңЁйқһе…¬е…ұиҢғеӣҙеҶ…дҪҝз”ЁпјҢе°ұжҳҜе®үе…Ёзҡ„гҖӮ - Blindman67
私有作用域是另一层“安全性”。你只需要防止这种情况:objectPump('一些参数','如果由用户提供,则必须对此输入进行消毒');就可以了。 - MartyIX
用户将永远无法访问该函数。我也不明白为什么要使用 typeof a !== "undefined",因为变量已经被定义为参数,a !== undefined 怎么可能失败呢? - Blindman67
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接