在 Parse 中管理实体时,我需要将许多对象绑定(bind)到当前登录的用户。
我的担忧是:
- 没有后端代码确保传入的
User
是当前登录的用户。 - 用户可以将任何新创建的对象分配给其他用户。
他们有this example TODO app在 the documentation 中未显示云代码以确保 Todo
分配给的 User
是当前登录的用户。
现在我浏览了the code我开始认为,无论何时保存一个对象,它都会与用户相关联。谁能解释为什么这个应用程序工作以及它如何将 Todo
与 User
相关联?
更新:没关系,我在他们的代码中找到了指定用户保存待办事项的位置。我的问题是,是什么阻止用户编写使用其他用户 ID 保存待办事项的代码?
this.todos.create({
content: this.input.val(),
order: this.todos.nextOrder(),
done: false,
user: Parse.User.current(),
ACL: new Parse.ACL(Parse.User.current())
});
更新 #2: 如果 User
对象的 ACL
设置为仅允许用户能够读取 User
他们拥有的对象,那么他们将无法查询以获取另一个用户对象以传递。但是,还有另外两个可能的问题:
- 他们是否可以传递用户的 objectId 而不是整个
User
对象,即使Todo
上的user
字段也是如此s 表需要_User
? - 我相信他们也可以创建一个新的用户对象并将其分配给该对象...我正在尝试考虑这会成为问题的场景,但我现在不能。
如果有人可以确认或提供对其中任何一个有帮助的解决方案。现在要尝试测试 #1。
更新 #3 -- 经过一些测试:
- 如果
Todo
表上的user
字段需要一个_User
对象,它不会将 objectId 作为字符串。< 但是他们可以创建一个新的用户对象并在那里设置 objectId 来解决这个问题。
var user = new Parse.User(); // Create user object user.id = "cqmEuj1Bzf"; // Assign user id // Create and save Todo var td = new Todo(); td.set("name", "Some ting todo"); td.set("user", user); td.save();
这正是我所担心的。 我能够成功地将 Todo 保存到另一个用户的帐户——只要我知道他们的 user_id (objectId
)。有了足够多的用户,他们可能至少可以猜出一个随机搞砸某人的帐户。
那现在呢?
回答:使用 Cloud Code 验证传入的用户是否与当前用户匹配。答案发布在 Parse's forums here 上.
最佳答案
您可以使用云代码来验证传入的用户是否与当前用户匹配。该答案发布在 Parse's forums here 上.
You can use Cloud Code to ensure that the objectId corresponds to the current user making this request. In fact, our sample application, Anypic, does this check on the "Photo" and "Activity" class.
From Anypic's Cloud Code:
Parse.Cloud.beforeSave('Activity', function(request, response) { var currentUser = Parse.User.current(); var objectUser = request.object.get('fromUser');
if(!currentUser || !objectUser) {
response.error('An Activity should have a valid fromUser.'); } else if (currentUser.id === objectUser.id) {
response.success(); } else {
response.error('Cannot set fromUser on Activity to a user other than the current user.'); } });
Parse.Cloud.beforeSave('Photo', function(request, response) { var currentUser = Parse.User.current(); var objectUser = request.object.get('user');
if(!currentUser || !objectUser) {
response.error('A Photo should have a valid user.'); } else if (currentUser.id === objectUser.id) {
response.success(); } else {
response.error('Cannot set user on Photo to a user other than the current user.'); } });
关于javascript - 使用 JavaScript API 的 Parse 中的对象安全性 - 将用户绑定(bind)到保存的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13277258/