Parse中的对象安全性使用JavaScript API - 将用户绑定到保存的对象

Mat*_*att 8 javascript node.js backbone.js parse-platform marionette

在Parse中管理实体时,我需要将许多对象绑定到当前登录的用户.

我担心的是:

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

他们有这个例子TODO的应用程序,其在文档显示没有云代码到位,以确保UserTodo被分配给在当前登录的用户.

现在我查看代码,我开始认为无论何时保存对象,它都会绑定到用户.任何人都可以解释为什么这个应用程序的工作原理以及它如何与Todos 关联User

更新:没关系,我在他们的代码中找到了他们指定要为Todo保存的用户的位置.我的问题是,是什么阻止用户编写代码来保存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())
      });
Run Code Online (Sandbox Code Playgroud)

更新#2:如果User对象的ACL设置只允许用户能够读取User他们拥有的对象,那么他们将无法查询以获取另一个用户对象.但是,还有两个可能的问题:

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

如果有人能够确认或提供任何有用的解决方案.要立即尝试测试#1.

更新#3 - 经过一些测试:

  1. 如果s表user上的字段Todo需要一个_User对象,则不会将objectId作为字符串.
  2. 然而,他们可以创建一个新的用户对象,并在那里设置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();
    
    Run Code Online (Sandbox Code Playgroud)

这就是我所担心的.我能够成功地将Todo保存到另一个用户的帐户 - 只要我知道他们的user_id(objectId).有了足够的用户,他们可能会猜到至少有一个用户随意搞砸某个人的帐户.

所以现在怎么办?

答案:使用Cloud Code验证传入的用户是否与当前用户匹配.答案发布在Parse的论坛上.

Dio*_*nes 1

您可以使用云代码来验证传入的用户是否与当前用户匹配。该答案已发布在Parse 的论坛上。

您可以使用 Cloud Code 确保 objectId 与发出此请求的当前用户相对应。事实上,我们的示例应用程序 Anypic 对“Photo”和“Activity”类进行了此检查。

来自 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.');   } });
Run Code Online (Sandbox Code Playgroud)