使用新功能是否存在安全风险?

时间:2015-10-28 08:42:28

标签: javascript

我有一个功能来帮助我创建临时对象并节省我输入的时间。

额外编辑:澄清此功能只会位于匿名函数内。

(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和第三方harker可以获得一些恶意代码的地方。到目前为止,它非常方便,我很想用new Function执行其他任务。

我应该使用new Function()生成代码,还是认为公共代码不好和/或危险。

1 个答案:

答案 0 :(得分: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功能。您还有其他可行的选择:

编辑:[{1}}功能不会给您的攻击者带来任何好处。 1)如果您的攻击者可以修改您的JS文件,那么她将立即使用objectPump并且她不需要任何eval。 2)如果您清理用户的所有输入,这里没有问题。

我主要担心的是你最终会在脚下射击,而不是攻击者。