【问题标题】:Using "eval" in a couchdb reduce - just how dangerous is this?在 couchdb reduce 中使用“eval”——这有多危险?
【发布时间】:2012-06-14 16:33:15
【问题描述】:

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

地图

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() 是通向疯狂的道路,但我想不出有什么方法可以真正让我陷入困境。 eval() 在 couchdb 视图中安全吗?

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

【问题讨论】:

  • 同样的代码可以在没有eval()join() 的情况下完成。这样你就不需要考虑什么了。

标签: javascript couchdb mapreduce


【解决方案1】:

你不能改用sum(avg) / avg.length吗?

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

【讨论】:

  • facepalm 是的,我当然可以。我会的。不过,我想问题仍然存在:如果 存在 可以调用 eval() 的情况,这里是否安全,因为我们可以很好地控制输入?
  • eval 可以在任何地方调用,但几乎总是有更轻量级的方法来做到这一点。
  • 这回答了我的问题。谢谢奥列格。
猜你喜欢
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多