如何在Mongoose中保护田野免受大规模分配?

时间:2013-06-22 22:50:49

标签: 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);

控制器通过传递参数来设置Thing:

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函数)。我想要传递params哈希值的任何本地Mongoose模型函数的质量赋值保护,例如,Thing构造函数和Thing.create函数。

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

1 个答案:

答案 0 :(得分:1)

捂脸:

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教你一个可怕的反模式。但是要回答你的问题,AFAIK mongoose和mongodb没有机制强制执行类似于rails的attr_accessible或任何受污染变量的概念。