在Mongoose中更新/创build模型时,有什么理由将用户input的数据列入白名单?

我发现自己在创build或保存用户之前执行此操作:

var data = _.pick(req.body, 'email', 'name', 'username', 'title'); 

但是我不知道它是否真的有必要。 例如,如果某人发送salthashedPassword或模型不支持的任何属性,会发生什么情况。 它会被扔掉吗?

salthashedPassword是我架构上的虚拟属性。

看起来,如果假设某人发送了一个包含其他dynamic属性的json对象(比如followers: ['fake1', 'fake2']等),就不会出现白名单危险。如果我明白,这将完全覆盖之前添加的内容这个正确。

Web开发中的经验法则是始终对input进行消毒。

话虽如此,mongoose有严格的select:

严格的选项,确保传递给模型构造函数的值在我们的模式中没有被指定,不会被保存到数据库中。

在Mongoose 2.x中,strict的默认值是false,但是在3.x中,strict选项现在被defult设置为true。

你可以在你的模式中指定它:

 new Schema({ .. }, { strict: true }) 

您也可以在您的模型上覆盖它:

 var Thing = db.model('Thing'); var thing = new Thing(doc, true); // enables strict mode 

虚拟属性不会被您提供给您的模型的数据覆盖。 这是因为Mongoose在内部存储虚拟属性的方式。

模式中的每个属性都定义了其types(虚拟属性具有VirtualType)。 虚拟属性内部存储在与“真实”属性不同的对象中。

在访问虚拟属性时,Mongoose将检查属性types并为该属性types调用getter(基本上,调用您为虚拟属性定义的函数)。

是的, data只包含您在pick列出的属性。 如果你的req.body有其他的领域,它不会在data

对于压倒性的部分,取决于你是如何做的。 在本地mongodb驱动程序中,API调用对于插入和更新是不同的。 更新也区分覆盖整个条目( $set )或只是一个领域。 但是在mongoose中,一个简单的顶级更新确实取代了整个文档。 所以,如果你使用这个,想限制条目,是的。 你可以在这里阅读。

但是,仍然总是检查你要存储在数据库中的东西。 pick完全是为了除去不需要的数据。