评估的替代品

xShirase

我的程序处理许多不同类型的文档以从中提取信息。它具有非常通用的结构,可以适应我们使用的数百种不同类型/格式的文档。

处理器代码:

Processor.prototype.process = function(){
    var self = this;
    var fields = self.processor_config;
    var p = {};
    for(key in fields){
        if(fields.hasOwnProperty(key)){
            p[key]=self._processKey(fields[key]);
            if(typeof(p[key])=='undefined' || p[key]===''){
                self.emit('warning', {
                    type: 'Problem parsing Key',
                    msg: 'Key : '+key,
                    doc: self.docName
                });
            }
        }
    }
    self.emit('extracted',p);
};

然后,processKey()函数根据“类型”字段来分类处理:

Productor.prototype._processKey = function(cnf) {
    var self = this;
    var value;
    if(cnf.type=="css"){
        value = self._processCSSKey(cnf);
    }else if(cnf.type=="regexp"){
        value = self._processRegexpKey(cnf);
    }else if(cnf.type=="custom"){
        value = self._processCustomKey(cnf);
    }
    return value;
};

有关从每种类型的文档中提取内容的信息来自mongodb集合:

具有2种类型的字段的虚拟配置:

doc_name: "FormK7",
processor_config: {
    company:{
        type:"css"
        selector:"p",
        ord:3,
        attr:{type:"text",parser:""}
    },
    litigation:{
        type:"custom"
        func:"(function(){var a =['123'];return a})()"
    },
}

上面的示例是没有用的,但是真实的东西具有更复杂的功能(尽管不多)。

我的自定义处理器看起来像:

Productor.prototype._processCustomKey = function(cnf) {
    var value = eval(cnf.func);
    return value;
};

我的问题是,我没有找到一种无需使用eval即可处理自定义键的方法。然而,简单地提到“评估”却让我想到了愤怒的道格拉斯·克罗克福德(Douglas Crockford)的照片,使我永远陷入了黑暗。

附加信息 :

  • 在现实生活中,最小化存储在mongo中的函数。

  • 需要通用处理器,因为每个文档类型只有一个处理器是非常浪费的(格式一直在变化,有数百种格式,有些只能使用一次...)。因此,需要以某种方式记录这些功能。而且它们太不同了,无法进行硬编码...

  • 没有用户输入,无法从网络上访问该应用程序。恶意用户在能够以mongo注入代码之前将可以访问服务器,因此安全性问题非常低。

因此,问题如下:

在这种情况下eval真的是邪恶的,还是有效的用例?是否有更好的方法/最佳实践来解决此问题?

克里斯

您可以创建一个模块,将其从mongo导出到临时文件,然后用于require导入该文件。这样,您就不会回避,并且像Bergi提到的那样,它将避免出现的示波器问题eval

另外,一旦导出它,并且在需要它之前,可以使用诸如Esprima之类的东西来创建代码的AST并对其进行分析,以查看其是否符合您可能具有的某些条件。(例如,也许您可​​以禁止在this导入的代码中使用该代码作为安全措施-这就是ADSafe规则的一部分)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章