3

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);

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

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

  // more...
};

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

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

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

4

1 回答 1

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 或任何受污染变量的概念。

于 2013-06-23T05:45:53.870 回答