node.js - 如何在 Mongoose 中保护字段免受大规模分配?

标签 node.js mongoose mass-assignment

Mongoose 模型 Thing 有两个字段,其中只有一个(安全)可以通过 mass assignment 设置:

var db = require('mongoose');

var schema = new db.Schema({
  safe:   { type: String }, // settable through mass assignment
  unsafe: { type: String }  // not settable through mass assignment
});

db.model('Thing', schema);

Controller 通过传递参数来设置事物:

exports.create = function(req, res) {
  var thing = new Thing(req.body);

  // more...
};

攻击者可能会尝试通过发出设置了 unsafe 的 JSON POST 请求来设置 thing.unsafe。应该避免这种情况。

如果像 Rails attr_accessible 功能这样的功能可用于 Mongoose,那就太好了。我确实找到了mongoose-mass-assign ,但这与我正在寻找的完全不同。一方面,mongoose-mass-assign 显然需要使用新的 API(两个 MassAssign 函数)。我希望对传递参数哈希值的任何 native Mongoose 模型函数进行批量赋值保护,例如 Thing 构造函数和 Thing.create 函数。

如何获得 Mongoose 模型的批量分配保护?如果不可用,Mongoose 用户目前如何防范此漏洞?

最佳答案

捂脸:

var thing = new Thing(req.body);

稍微理智一些:

var okFields = {};
okFields.safe = req.body.safe
var thing = new Thing(okFields);
//Also helpful for longer whitelists from underscore: _.pick(req.body, "safe");
//Also feel free to add some, y'know, data validation either here or in mongoose

只是不要这样做。 Rails 教会了你一个可怕的反模式。但要回答你的问题,据我所知,mongoose 和 mongodb 都没有机制来强制执行类似于 Rails 的 attr_accessible 或任何受污染变量概念的机制。

关于node.js - 如何在 Mongoose 中保护字段免受大规模分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17256065/

相关文章:

vb.net - 具有多个输出的 VB 函数 - 结果分配

javascript - 使用 express.js 在 POST 上提供静态内容

javascript - 在套接字 io 连接中设置用户名

javascript - 如何让 npm start 在 Ubuntu 上工作?

javascript - 如何使用express中间件来处理所有路由?

ruby-on-rails - Rails 3.2 严格的质量分配默认值

javascript - 使用嵌入文档列表和使用 ObjectId 列表之间有区别吗?

node.js - Mongoose .save() 无法在没有回调的情况下工作

angular - 如何在 angular2/浏览器上使用 mongoose

ruby-on-rails - Rails 无法为 id、created_at 批量分配 protected 属性