我有一个功能来帮助我创建临时对象并节省我输入的时间。
额外编辑:澄清此功能只会位于匿名函数内。
(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()
生成代码,还是认为公共代码不好和/或危险。
答案 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
功能。您还有其他可行的选择:
使用typeof
来定义默认值,即使它输入的内容更多:
function foo(a, b)
{
a = typeof a !== 'undefined' ? a : 42;
b = typeof b !== 'undefined' ? b : 'default_b';
...
}
编辑:[{1}}功能不会给您的攻击者带来任何好处。 1)如果您的攻击者可以修改您的JS文件,那么她将立即使用objectPump
并且她不需要任何eval
。 2)如果您清理用户的所有输入,这里没有问题。
我主要担心的是你最终会在脚下射击,而不是攻击者。