我正在使用Mongoose / MongoDB创建一个Web应用程序来存储将被投票的信息。我将通过投票存储用户名和IP地址(因此如果需要,选民可以更新/修改他们的投票)。
根问题:在Mongoose架构中安全架构投票的最佳方法是什么?
目前,我的架构看起来像这样(简化):
var Thing = new Schema({
title: {
type: String
},
creator: {
type: String
},
options: [{
description: {
type: String
},
votes: [{
username: {
type: String
},
ip: {
type: String
}
}]
}]
});
mongoose.model('Thing', Thing);
虽然这样可以查询任何给定Thing
超级容易的数据库,但由于显而易见的原因,安全问题变得更加严重 - 我不想将用户名和IP地址返回给浏览器。
问题是,我不确定哪个是将Thing
数据安全地返回到浏览器的最佳/最不痛苦的方案:
循环遍历Thing.options
中的每个选项,然后通过Thing.options[i].votes
中的每个投票进行子循环以查找请求数据的用户投票,然后删除所有投票以摆脱其他用户数据。这似乎是非常耗费资源的,但是我找不到在子阵列中使用indexOf的方法(指导欢迎这个),即Thing.options.votes.indexOf(username)
或其他类似的东西。
在已存在的User
架构中存储投票信息,然后必须在所有用户中搜索投票数据,并在每次要查询单个Thing
时将其全部放在一起。这似乎效率低下/资源密集程度更高/更复杂。
创建一个单独的Vote
架构,可以更方便地存储数据,但随后会添加另一个数据库调用(一个用于Thing
,一个用于Vote
。
这个问题有点复杂,因为有不同的投票方式,这是最简单的。
研究......为了后人的缘故:
This question解决了数据库中的投票问题,但对于关系数据库,不是MongoDB / Mongoose。
This question解决了Mongoose / Node.js应用程序架构,但没有涉及投票。
This NPM Module增加了对Mongoose架构的投票,但不太适合我的需求。
This post看起来很有希望,因为作者正在做我在上面第1点所描述的内容(参见作者帖子的清单13),但他仍然创建了一个嵌套循环,从第22行开始在清单13中,循环遍历每个选项/选项,然后通过每个选项/选项的每个投票。
答案 0 :(得分:1)
作为一个快速提示 - 防止从DB泄露IP地址 - 我建议添加额外的集合,它将存储所有投票敏感数据,但在同一文档中仍有其他投票数据。
这在存储数据时会产生很小的开销,但是根据设计,不会向调用者提供IP信息,也不需要在每次调用时进行额外的数据清理,以保护数据。