搜索MongoDB时不区分大小写 - 是eval()好吗?

时间:2013-07-10 13:09:01

标签: javascript security mongodb eval

我有很多记录存储在MongoDB中,它们(大多数)是用title-case编写的。示例原型:

{
   'name':'Awesome Pair of Jeans',
   'designer':'Company123',
   'description':'This pair of jeans is really great. Navy colour.'
},{
   'name':'awesome jeans part 2',
   'designer':'company123',
   'description':'This pair of jeans is also navy in colour.'
}

在我的前端(构建在Angular / Node上),我想让用户能够搜索记录,但是由于MongoDB的搜索区分大小写,我遇到了一些问题。

目前,如果有人在“名称”字段中搜索“awesome”(小写)这个词,我唯一可以确保返回awesomeAwesome的方法就是查询如下:

首先,查询包含在正则表达式中。因此,如果用户搜索“awesome”,则会将其作为name:/awesome/i

传递给查询
exports.postsQuery = function(req,res){
    var query = req.params.query; // 'name:/awesome/i'
    var properties = query.split('+');
    var criteria = {};
    properties.forEach(function(property) {
        var propParts = property.split('=');
        criteria[propParts[0]] = eval(propParts[1]); // criteria{name:/awesome/i};
    });

    db.products.find(criteria, function (err, record) {
       // Do stuff
    });
}

这会返回正确的结果,但我想知道它有多安全,如果有更好的方法可以做到这一点。

与此问题类似:Case insensitive search in Mongo但我想知道速度和安全性的最佳做法是什么。

1 个答案:

答案 0 :(得分:1)

而不是构建/awesome/i字符串,最好传递awesome然后而不是

criteria[propParts[0]] = eval(propParts[1])

你可以做到

criteria[propParts[0]] = new RegExp(propParts[1], "i");

将返回您当前获得的RegExp,但不使用eval并使用较少的字符串操作。