Node.js 如何在猫鼬中保护字段不受质量分配的影响?

Node.js 如何在猫鼬中保护字段不受质量分配的影响?,node.js,mongoose,mass-assignment,Node.js,Mongoose,Mass Assignment,猫鼬模型Thing有两个字段,其中只有一个(安全)字段可通过以下方式设置: 控制器通过传递参数进行设置: exports.create = function(req, res) { var thing = new Thing(req.body); // more... }; 攻击者可以通过发出设置为不安全的JSON POST请求来尝试设置thing.unsafe。这是应该防止的 如果Mongoose可以使用Rails attr_之类的可访问功能,那就太好了。我确实找到了,但这和我要找

猫鼬模型Thing有两个字段,其中只有一个(安全)字段可通过以下方式设置:

控制器通过传递参数进行设置:

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

  // more...
};
攻击者可以通过发出设置为不安全的JSON POST请求来尝试设置thing.unsafe。这是应该防止的

如果Mongoose可以使用Rails attr_之类的可访问功能,那就太好了。我确实找到了,但这和我要找的完全不同。首先,mongoose mass assign显然需要使用新的API(两个MassaSign函数)。我希望为任何传递参数散列的本机Mongoose模型函数提供大规模分配保护,例如,Thing构造函数和Thing.create函数

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

Facepalm:

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

为什么是“反模式”和“Facepalm”?如果不支持像attr_accessible这样的白名单机制,这是有意义的。听起来你是说没有白名单,所以不要做大规模作业,这似乎是显而易见的,也是问题的关键。FWIW,省略了验证,以使示例集中于质量分配问题。认为您可以从不受信任的客户端获取原始数据块并将其推入数据库的想法完全是错误的。在任何实际应用程序中都无法做到这一点。您需要运行数据验证并检查授权。安全生产代码从来就不是这样的。让演示博客应用程序在100行代码中运行是一种愚蠢的做法。没什么了,谢谢你的观点。我使用了您概述的方法,效果很好。使用Mongoose的
strict
模式(版本3+的默认设置),不在模式中的字段将不会保存到数据库中。因此,您可以使用
\省略
或其他黑名单字段,这样会非常安全。不过,白名单比黑名单更不容易出现开发人员错误。
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