【问题标题】:Sanitize user input in Mongoose在 Mongoose 中清理用户输入
【发布时间】:2021-07-10 03:48:42
【问题描述】:

除了this fairly uninformative answer 和另一个unpopular answer,我似乎找不到任何关于使用 Mongoose 清理用户输入的资源。

有一个关于 Node/MongoDB 注入的 blog post here 在服务器级别似乎不错,但在中间件级别(即 Mongoose)必须有一些东西可以清理输入并确保数据库中的合理安全性。

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

【问题讨论】:

  • @JohnnyHK 你似乎是这里的专家 - 你能权衡一下吗?

标签: node.js mongodb mongoose


【解决方案1】:

似乎mongo-sanitize npm 模块是原始转义功能的起点。老实说,这在连接/表达中间件层听起来更合适,因为在猫鼬层,根据设计,代码不会对查询/更新参数施加任何期望,即它们是否由应用程序开发人员编写(在这种情况下,它们不得进行消毒,否则它们将无法正常工作)或涉及用户输入(必须进行消毒)。因此,我建议使用中间件函数来清理最常见的用户输入输入位置:req.bodyreq.queryreq.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);

【讨论】:

  • For the passionately lazy... 我已经喜欢它了——看起来这就是我想要的。您关于在传递到数据模型层之前进行清理的观点很有意义。谢谢彼得,还有很棒的网站顺便说一句。
  • 刚刚试用过,效果与宣传的一样,易于使用。
  • 灵感来自 mongo-sanitize(快速中间件):github.com/fiznool/express-mongo-sanitize
【解决方案2】:

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

也可以使用原生escape() 方法来保护数据库。

运行下面的代码sn-p查看结果。

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

【讨论】:

  • escape() 不适合网络。它不使用 HTML 实体,并且转义太多,包括空格。
  • 是的,你是对的。但它仍然可以用于过滤_id 和其他特定字段。 content-filter 也可用于大多数情况。
猜你喜欢
  • 2018-11-04
  • 1970-01-01
  • 1970-01-01
  • 2013-09-14
  • 2019-07-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-30
  • 1970-01-01
相关资源
最近更新 更多