使用JavaScript APIparsing对象安全性 – 将用户绑定到保存的对象
在pipe理Parse中的实体时,有很多对象需要绑定到当前login的用户。
我的顾虑是:
- 没有后端代码确保被传入的
User
是当前login的用户。 - 用户可以将任何新创build的对象分配给其他用户。
他们有这个示例TODO应用程序 ,在文档中没有显示云代码,以确保Todo
分配的User
是当前login的用户。
现在我查看代码,我开始认为每当一个对象被保存时,它就会被绑定到用户。 任何人都可以解释为什么这个应用程序的工作原理,以及如何将Todo
与User
关联?
更新:没关系,我在他们的代码中find了他们指定用户保存Todo的地方。 我的问题是,什么阻止用户编写的代码保存待办事项与他人的用户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
对象,那么他们将无法查询获得另一个用户对象传递。 但是,还有两个可能的问题:
- 即使
Todo
表上的user
字段需要_User
,他们是否有可能传递用户的objectId而不是整个User
对象? - 我相信他们也可以创build一个新的用户对象,并将其分配给…我试图想到一个场景,这将是一个问题,但我现在不能。
如果任何人都可以确认或提供解决scheme,那将是有帮助的。 现在试着testing#1。
更新#3 – 经过一些testing:
- 如果
Todo
表上的user
字段需要_User
对象,则不会将objectId作为string。 -
然而,他们可以创build一个新的用户对象,并设置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
)。 有足够的用户,他们可能会猜测至less有一个随机搞砸了某人的帐户。
所以现在怎么办?
答:使用Cloud Codevalidation用户是否与当前用户相符。 答案在这里发表在Parse的论坛上 。
您可以使用云代码来validation用户是否通过了与当前用户的匹配。 这个答案在这里发表在Parse的论坛上 。
您可以使用Cloud Code来确保objectId对应于发出此请求的当前用户。 实际上,我们的示例应用程序Anypic在“照片”和“活动”类中进行了检查。
来自Anypic的云代码:
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.'); } });