2015-10-28 58 views
2

我有一個函數可以幫助我創建臨時對象並節省我的時間輸入。正在使用新功能被視爲安全風險?

附加編輯:澄清此功能將永遠坐在anon函數內。

(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()來生成代碼,或者它被認爲是壞的和/或危險的公共代碼。

+0

你能告訴我怎麼使用這個工具嗎? '新功能'可能不是必需的。 (這是不好的習慣,是的,但現在看起來並不存在任何漏洞......但是如果沒有在上下文中看到它也很難說。) – Ryan

+0

在編輯中增加了用法。 – Blindman67

+0

你如何實現這一點有點令人費解。這樣做「正常」的方式會使它更清潔,你不需要eval或'new Function'。 – JJJ

回答

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)如果你清理了用戶的所有輸入,這裏沒有問題。

這裏我主要關心的是你最終會把自己踢在腳下而不是攻擊者的意志。

+0

但是,如果我有'objectPump'內'(函數(){VAR objectPump =函數(){...};})()'?他們是如何訪問功能添加惡意代碼。這是我不明白的。 – Blindman67

+1

函數'objectPump'不會給攻擊者帶來任何好處。 1)如果你的攻擊者可以修改你的JS文件,那麼她會立即使用'eval',她不需要任何'objectPump'。 2)如果你清理了用戶的所有輸入,這裏沒有問題。 我最關心的是你最終會在腳下自己射擊,而不是攻擊者的意志。 –

+0

所以你所說的是,只要我把它放在公共範圍之外,使用'new Function'就是安全的。 – Blindman67