在 Mongoose 中清理用户输入
Sanitize user input in Mongoose
除了 this fairly uninformative answer and another unpopular answer,我似乎找不到任何关于使用 Mongoose 清理用户输入的资源。
有一个关于 Node/MongoDB 注入的 blog post here 在服务器级别看起来不错,但在中间件级别(即 Mongoose)必须有一些东西可以清理输入并确保合理的安全性数据库。
有这样的野兽,还是有必要?
似乎 mongo-sanitize npm 模块是原始转义功能的起点。老实说,这在 connect/express 中间件层听起来更合适,因为在 mongoose 层,根据设计,代码不会对 query/update 参数施加任何期望,即它们是否由应用程序开发人员编写(在这种情况下,它们不能被清理,否则它们将无法正常工作)或涉及用户输入(必须被清理)。因此,我建议使用中间件函数来清理最常见的用户输入位置:req.body
、req.query
和 req.params
。因此,例如,您可能会做类似 (sketch):
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);
有一个新工具可以自动控制即将到来的 URL 和 html 正文数据。
https://www.npmjs.com/package/content-filter
也可以使用本机 escape()
方法来保护数据库。
运行 下面的代码片段可以看到结果。
let a = "{$gt:25}"
console.log(a)
console.log(escape(a))
除了 this fairly uninformative answer and another unpopular answer,我似乎找不到任何关于使用 Mongoose 清理用户输入的资源。
有一个关于 Node/MongoDB 注入的 blog post here 在服务器级别看起来不错,但在中间件级别(即 Mongoose)必须有一些东西可以清理输入并确保合理的安全性数据库。
有这样的野兽,还是有必要?
似乎 mongo-sanitize npm 模块是原始转义功能的起点。老实说,这在 connect/express 中间件层听起来更合适,因为在 mongoose 层,根据设计,代码不会对 query/update 参数施加任何期望,即它们是否由应用程序开发人员编写(在这种情况下,它们不能被清理,否则它们将无法正常工作)或涉及用户输入(必须被清理)。因此,我建议使用中间件函数来清理最常见的用户输入位置:req.body
、req.query
和 req.params
。因此,例如,您可能会做类似 (sketch):
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);
有一个新工具可以自动控制即将到来的 URL 和 html 正文数据。 https://www.npmjs.com/package/content-filter
也可以使用本机 escape()
方法来保护数据库。
运行 下面的代码片段可以看到结果。
let a = "{$gt:25}"
console.log(a)
console.log(escape(a))