问题 清理Mongoose中的用户输入


除了 这个相当没有说服力的答案 和另一个 不受欢迎的答案,我似乎无法找到任何有关使用Mongoose清理用户输入的资源。

有一个 博客文章在这里 关于Node / MongoDB注入在服务器级别看起来很好,但中间件级别(即Mongoose)必须有一些可以清理输入并确保数据库合理安全的东西。

有这样的野兽,还是甚至是必要的?


12646
2018-02-25 03:00


起源

@JohnnyHK你似乎是这里的专家 - 你能称重吗? - Ben


答案:


好像是 蒙戈-的sanitize npm模块是原始转义功能的起点。老实说,这听起来更适合于连接/表达中间件层,因为在mongoose层,根据设计,代码对于查询/更新参数是否由应用程序开发人员编写而言没有任何期望(在这种情况下,不得消毒或不能正常工作)或涉及用户输入(必须消毒)。因此,我建议使用中间件函数来清理用户输入最常见的输入位置: req.bodyreq.query,和 req.params。例如,您可能会执行类似(草图)的操作:

var json = require("body-parser").json;
var sanitize = require("mongo-sanitize");

function cleanBody(req, res, next) {
  req.body = sanitize(req.body);
  next();
}

function updateUser(req, res) {
  //...
  // safe to build an update query involving req.body here
}
app.put("/api/users", json(), cleanBody, updateUser);

13
2018-02-25 03:30



For the passionately lazy... 我已经喜欢它 - 看起来就像我在寻找的那样。在传递到数据模型层之前,关于清理的观点非常有意义。谢谢彼得,以及伟大的网站BTW。 - Ben
刚刚试过这个,按照广告宣传,易于使用。 - Ben
灵感来自mongo-sanitize(快速中间件): github.com/fiznool/express-mongo-sanitize - Mike


有一个新工具可以自动控制即将到来的URL和html正文数据。 https://www.npmjs.com/package/content-filter

也是原生的 escape() 方法可用于保护数据库。

运行下面的代码段以查看结果。

let a = "{$gt:25}"
console.log(a)
console.log(escape(a))


0
2017-08-12 09:22