使用JavaScript APIparsing对象安全性 – 将用户绑定到保存的对象

在pipe理Parse中的实体时,有很多对象需要绑定到当前login的用户。

我的顾虑是:

  1. 没有后端代码确保被传入的User是当前login的用户。
  2. 用户可以将任何新创build的对象分配给其他用户。

他们有这个示例TODO应用程序 ,在文档中没有显示云代码,以确保Todo分配的User是当前login的用户。

现在我查看代码,我开始认为每当一个对象被保存时,它就会被绑定到用户。 任何人都可以解释为什么这个应用程序的工作原理,以及如何将TodoUser关联?

更新:没关系,我在他们的代码中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对象,那么他们将无法查询获得另一个用户对象传递。 但是,还有两个可能的问题:

  1. 即使Todo表上的user字段需要_User ,他们是否有可能传递用户的objectId而不是整个User对象?
  2. 我相信他们也可以创build一个新的用户对象,并将其分配给…我试图想到一个场景,这将是一个问题,但我现在不能。

如果任何人都可以确认或提供解决scheme,那将是有帮助的。 现在试着testing#1。

更新#3 – 经过一些testing:

  1. 如果Todo表上的user字段需要_User对象,则不会将objectId作为string。
  2. 然而,他们可以创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.'); } });