我在玩.

为了立即启动并运行一些东西,我将直接将Express query string对象传递给mongoose find函数.我想知道的是,在一个实时应用程序中,这种做法会有多危险.我知道RDBMS极易受到SQL注入的影响.除了"净化你的输入"的好建议之外,这段代码有多邪恶:

app.get('/query', function (req, res) {
    models.findDocs(req.query, function (err, docs) {
            res.send(docs);
        });
});

这意味着get请求http://localhost:8080/query?name=ahsteele&status=a只会将以下内容推到findDocs函数中:

{
  name: 'ahsteele',
  status: 'a'
}

出于很多原因,这让人觉得恶心,但它有多不安全?向mongodb传递查询参数的最佳实践是什么?express是否提供任何开箱即用的卫生处理?

推荐答案

至于注入问题,比如SQL,风险要低得多...尽管理论上可能通过未知的攻击向量.

数据 struct 和协议是二进制和API驱动的,而不是在特定于域的语言中利用转义值.基本上,你不能欺骗解析器在最后添加一个"db.dropCollection()".

如果它只用于查询,可能没问题...但我还是要提醒你,使用一点验证:

  • 确保仅使用字母数字字符(过滤或使空值无效,以及其他您通常不接受的内容)
  • 强制每个术语的最大长度(比如255个字符)
  • 强制执行整个查询的最大长度
  • 剥离special个以"$"开头的参数名,比如"$where"&;这样的
  • 不允许嵌套数组/文档/哈希...只有字符串&;ints

此外,请记住,空查询会返回所有内容.您可能需要对该返回值进行限制.:)

Mongodb相关问答推荐

在出现错误时忽略mongodb事务回滚是好做法吗

数组中字符串的Mongo查询集合和推送到新数组嵌套对象

mongo如何通过聚合加载嵌套文档

Meteor 中的平均聚合查询

MongoDB:设置 Windows 服务

如何在 Ruby on Rails 环境中使用 Mongoid 进行通配符搜索?

如何使用 mongodb 和 php 正确处理分页查询?

ZonedDateTime 与 MongoDB

如何使用 MongoDB 建模 likes投票系统

MEAN 堆栈文件上传

Mongo:无法在 src/mongo/shell/mongo.js:145 连接到服务器 127.0.0.1:27017

在 MongoDB 中插入或更新许多文档

在安装的 MongoDB homebrew 中设置 dbpath (Mac OS)

Python Django-REST-framework 和 Angularjs 的文件夹 struct

我如何使用 Twitter 的流 api 中的推文并将它们存储在 mongodb 中

pre save和validate之间的mongoose区别?什么时候用哪一个?

多次使用位置 `$` 运算符来更新嵌套数组

在 mongodb 集合中查找最旧/最新的帖子

findOneAndUpdate 中的文档未更新

开发人员必须采取哪些mental steps才能开始从 SQL 迁移到 NOSQL(CouchDB、Fathom DB、MongoDB 等)?