Javascript 如何在Meteor中只允许插入和更新某些文档字段?
我用的是Meteor,我担心可能存在安全漏洞。我只希望用户能够在数据库中创建和修改某些字段。对于本例,我希望他们能够创建或更新的唯一内容是聚会的Javascript 如何在Meteor中只允许插入和更新某些文档字段?,javascript,mongodb,security,meteor,Javascript,Mongodb,Security,Meteor,我用的是Meteor,我担心可能存在安全漏洞。我只希望用户能够在数据库中创建和修改某些字段。对于本例,我希望他们能够创建或更新的唯一内容是聚会的name和description字段 Parties.allow({ insert: function (userId, party) { return userId && party.owner === userId; }, update: function (userId, party, fields, modif
name
和description
字段
Parties.allow({
insert: function (userId, party) {
return userId && party.owner === userId;
},
update: function (userId, party, fields, modifier) {
return userId && party.owner === userId;
},
});
这是我在Angular Meteor教程中看到的代码,但是看起来有人可以使用Minimongo在浏览器的控制台中添加他们想要的任何字段。是否有一种方法可以轻松定义正常的字段,并拒绝所有不使用这些字段的插入和更新?我可以编写一个简单的函数,用于更新:
function ensureFieldsAreOk(acceptableFields,fieldsInQuestion){
for(i = 0; i < fieldsInQuestion.length; ++i){
if(acceptableFields.indexOf(fieldsInQuestion[i]) === -1){
console.log("Hacking attempt detected");
return false;
}
}
return true;
}
函数ensureFieldsAreOk(可接受字段,字段问题){
对于(i=0;i
要对insert命令执行此操作,我可以使用与可接受字段列表相同的函数使用Object.keys(party)
我无法想象我是第一个想到这一点的人;必须有一个标准的方法来处理这个问题。我不认为这样做有什么错,我也不知道有什么方法更合适。通过使用下划线,您可以大大减少测试:
Parties.allow({
insert: function (userId, party) {
return userId && party.owner === userId
&& _.difference(_.keys(party), acceptableFields).length == 0;
},
update: function (userId, party, fields, modifier) {
return userId && party.owner === userId
&& _.difference(fields, acceptableFields).length == 0
}
});
别担心,你的问题完全正确。我在Meteor应用程序中处理此问题的方法是筛选正在插入或更新的文档。由于传递给
insert
和update
权限函数的参数不同,我对insert和update采取的方法不同
我建议直接使用以下代码或类似代码,以满足您根据上述标准可能具有的任何其他需求:
Parties.allow({
insert: function(userId, doc) {
var allow = true;
if(!userId || doc.owner !== userId) {
allow = false;
}
Object.keys(doc).forEach(function(docKey) {
if(acceptableFields.indexOf(docKey) < 0) {
allow = false;
}
});
return allow;
},
update: function(userId, doc, fieldNames, modifier) {
var allow = true;
if(!userId || doc.owner !== userId) {
allow = false;
}
fieldNames.forEach(function(fieldName) {
if(acceptableFields.indexOf(fieldName) < 0) {
allow = false;
}
});
return allow;
}
});
Parties.allow({
插入:函数(用户ID、文档){
var-allow=true;
如果(!userId | | doc.owner!==userId){
允许=假;
}
Object.key(doc.forEach)函数(docKey){
if(可接受字段索引of(docKey)<0){
允许=假;
}
});
允许返回;
},
更新:函数(用户名、文档、字段名、修饰符){
var-allow=true;
如果(!userId | | doc.owner!==userId){
允许=假;
}
fieldName.forEach(函数(fieldName){
if(可接受字段.索引of(字段名)<0){
允许=假;
}
});
允许返回;
}
});
正如您在代码示例中所看到的,我已经包含了您对用户是否登录以及用户是否是他们试图插入或更新到数据库中的文档的所有者的检查。另外,insert
函数直接检查文档的键(显然,如果您必须检查比顶级键更深的键(如我的代码示例),则可以进行更彻底的检查),如果可接受字段列表中不包含任何键,则会导致允许失败。对于update
功能,由于doc
参数是未更改的文档,因此需要检查fieldNames
参数。与插入功能一样,如果需要对比顶级键更深的键执行更彻底的检查,可以直接检查修饰符
参数,并找出插入尝试中引用的每个键。对于您可能需要确定最终解决方案外观的所有信息,请查看Meteor文档
最后,我使用通用Javascript编写了我的答案,以防您选择这条路线。显然,您可以使用下划线等库来增强我的建议。限制与您可以使用的集合关联的字段,并 您可以定义、字段、它们的类型、默认值和许多其他选项 为了确保用户只能更新特定字段,您可以使用更新允许/拒绝规则中的fieldNames属性进行检查:
update: function (userId, doc, fieldNames, modifier) {
// check fieldNames here.
}
或者,你可以考虑。