我试图阻止用户更新mongodb对象中的某些字段,允许他们编辑其他所有字段。例如,用户应该能够编辑/添加/删除除“字段”字段之外的所有字段。我目前的方法是测试用户试图“$ set”的每个密钥,看看它是否以子字符串“permissions”开头(以覆盖点表示法)。 python中的示例:
def sanitize_set(son):
return {"$set": {k: v for k, v in son.get("$set", {}).items()
if not k.startswith("permissions")}}
这种方法非常简单,似乎很有效。我想联系社区,看看是否有其他人之前已经解决过这个问题,或者看到我的方法存在明显的缺陷。谢谢,
约书亚
答案 0 :(得分:2)
没有看到一些示例数据,并解释了应该/不应该更新的内容 - 很难说是肯定的,但是我要防止这种情况的方法是不允许用户直接提供他们将要更新的字段。例如,假设您有一个名为update_employee
的函数,它更新了员工文档中的信息。如果你这样实现它:
update_employee(employee):
db.employees.update({_id: session.user_id}, {$set: employee})
随着employee
对象传入的内容将被更新。相反,您可以使用传入的值创建更新对象,如下所示:
update_employee(employee):
updatedEmployee = {
email: employee.email,
address: employee.address,
phone: employee.phone
}
db.employees.update({_id: session.user_id}, {$set: updatedEmployee})
这样您就可以完全控制数据库中的更新内容。因此,如果传入一个额外的字段(例如salary
),它将被忽略。
答案 1 :(得分:0)
由于(据我所知)没有字段锁定,在这种情况下你可以做的是创建一个例程来获取特定文档,以任何你想要的方式呈现给用户,但只是只显示允许他们编辑的字段。
您可以将整个JSON表示呈现给用户(编辑器),并拥有一个例程,该例程不允许更改锁定的字段。换句话说,如果您不希望编辑字段{"name": "Sam"}
,即使编辑器将此值更改为{"name": "Joe"}
,只需在更新之前将其踢出并仅更新允许编辑的字段。由于它是在实际更新(upsert)之前在内存中完成的,因此您可以完全控制正在编辑的内容和不编辑的内容。
如果您遵循一个前缀为e_address的方案,其中您决定使用e_允许编辑的任何字段,则可以通过编程方式轻松完成该工作。
即使在用户定义的角色中,我也没有看到任何锁定集合中特定字段的可能性。 (我可能在这里错了。)
这里的编程结构很简单 A.将字段拾取到内存中 B.编辑进行编辑 C.仅更新允许编辑的字段。任何其他更改都会忽略。
(我保留这个答案是通用的,因为我不使用Python,尽管该构造应该适用于任何语言。)