在couchdb中使用“eval”减少 - 这有多危险?

时间:2012-06-14 16:33:16

标签: javascript couchdb mapreduce

我的文档包含错误列表。 我有一个视图,它会计算具有特定错误的文档数量,以及具有给定错误的文档有多少错误的平均值。

地图

function (doc) {
var i;
for (i = 0; i < doc.errors.length; i = i + 1){
    emit([doc.errors[i], doc.flummery], [1, doc.errors.length])
}

}

减少

function (key, values, rereduce) {
var avg = [];
var cnt = [];
var i;
for (i = 0; i < values.length; i = i + 1) {
    avg.push(values[i][1]);
    cnt.push(values[i][0]);
}
return [sum(cnt), eval(avg.join("+")) / avg.length]

}

我已多次读过使用eval()是疯狂的途径,但我想不出任何方式它可以真正让我在这里绊倒。在couchdb视图中eval()是否安全?

请注意,Oleg提出了明显的答案,即“不要那样做,couchdb给你一个sum()函数”。在这种情况下显而易见的是,不需要eval()。但是,如果我需要它,是否可以安全使用,因为我可以很好地控制输入?

1 个答案:

答案 0 :(得分:2)

您不能使用sum(avg) / avg.length吗?

eval有明显的缺点,即调用编译器的全部功能:它非常耗费资源,并且除非您仔细清理输入,否则会引入很大的安全漏洞。