使用NodeJS进行Eval MongoDB查询

时间:2015-12-10 23:48:46

标签: node.js mongodb

我有一个MongoDB的查询界面,我正在通过HTTP请求从浏览器向NodeJS发送查询。 查询以字符串发送,可以是这样的:

var query = '{_id: ObjectId(\'536b07935c89be214c000009\'), "date": ISODate("2012-12-19T06:01:17.171Z"), mail: /test/i}'

我的问题是,如何安全地评估此字符串以将其发送到MongoDB NodeJS客户端?

eval不是一个选项(在MongoDB和NodeJS上),因为这是面向消费者的应用程序的一部分。

我对其他安全解决方案持开放态度,通过HTTP传递查询并在服务器上正确执行它们。

1 个答案:

答案 0 :(得分:0)

您呈现的字符串是mongodb shell查询。 此字符串包含mongodb shell特定的数据类型,因此只能在mongodb shell中使用。 您无法在不同的(javascript)环境中解析或评估这些查询,因为它们不是有效的JSON。因此,由于特定的数据类型,evalJSON.parse甚至无法工作。

如果要序列化mongodb查询以便在不同的环境中使用,可以使用MongoDB Extended JSON。

https://docs.mongodb.org/v3.0/reference/mongodb-extended-json/

这是标准的JSON,可以包含mongodb数据类型。 您的查询在MongoDB扩展JSON中是这样的。

{
    "_id": {
        "$oid": "536b07935c89be214c000009"
    },
    "date": {
        "$date": "2012-12-19T06:01:17.171Z"
    },
    "mail": {
        "$regex": "test",
        "$options": "i"
    }
}

如果要解析或评估这样的字符串以将其传递给node.js mongodb驱动程序,则需要使用库将其反序列化为正确的Node.js MongoDB驱动程序对象。

您可以使用此库来执行此操作:
https://www.npmjs.com/package/mongodb-extended-json

您还可以在浏览器中使用此库来构建查询。或者你可以手工构建mongodb查询。

我不知道plugin / npm包允许您自动将mongodb shell查询转换为MongoDB Extended JSON。您可以尝试通过实现自己的一些类型(ISODate,ObjectId)来自动转换它们。但是你永远不会在mongodb shell和mongodb nodejs驱动程序之间完全兼容,许多方法有不同的签名和返回类型,游标的工作方式不同等等......

还有这个项目,是官方支持的mongodb nodejs驱动程序的替代品,如果你真的重视它,它会试图模仿shell,但是它不会帮助你解决特定的查询,你和# 39;还是需要转换它 https://docs.mongodb.org/ecosystem/drivers/node-js/