Parse.com安全性:我可以保存一个对象并声称它是另一个用户吗?

时间:2014-08-17 06:08:32

标签: javascript security parse-platform

我正在查看使用javascript建模博客系统的this example,代码片段如下所示:

var user = Parse.User.current();

// Make a new post
var Post = Parse.Object.extend("Post");
var post = new Post();
post.set("title", "My New Post");
post.set("body", "This is some great content.");
post.set("user", user);
post.save(null, {
  success: function(post) {
    // Find all posts by the current user
    var query = new Parse.Query(Post);
    query.equalTo("user", user);
    query.find({
      success: function(usersPosts) {
        // userPosts contains all of the posts by the current user.
      }
    });
  }
});

它基本上创建一个post对象,并将当前用户对象设置为其user字段。要显示当前用户的所有博客帖子,它会查询所有博客帖子,并将user字段设置为当前用户。

但是,由于默认情况下User表只对所有用户都是只读的,因此恶意用户(X)可以创建随机帖子并“声称”他们正在创建这不会有问题另一位用户(Y)通过在user表格查询时将这些帖子的Y字段设置为User?因此,当系统显示用户Y的帖子时,他会看到除X“伪造”的帖子之外的所有真实帖子。

缓解User表需要以某种方式进行ACL吗?但如果它是解决方案,那么为什么任意用户可以看到整个User表的默认行为?

2 个答案:

答案 0 :(得分:3)

Cloud Code是您的朋友。

在这种情况下,您需要beforeSave处理程序将user字段锁定到新对象上当前已通过身份验证的用户,如果他们正在更新帖子并尝试更改,则拒绝保存user字段(或仅使用ACL来阻止除帖子所有者之外的所有人修改Post行)。

这样的事情:

Parse.Cloud.beforeSave('Post', function(request, response) {
  var post = request.object;
  var user = request.user;
  if (post.isNew()) {
    post.set('user', user);
    response.success();
  } else {
    // any special handling you want for updates, e.g.:
    if (post.dirty('user')) {
      response.error('Cannot change the owner of a Post!');
    } else {
      response.success();
    }
  }
});

我推荐的方法来处理像" Post"将阻止所有更新。在"设置权限"对于数据浏览器中的类,我将更改以下内容:

Update : Disabled
Delete : Disabled

要禁用某些内容,只需取消选中"任何用户都可以执行此操作"。或者,您可能希望分配一个类似" Administrator"的角色。或者"主持人"允许这些人直接更新/删除项目。

只有在使用useMasterKey()时才能从Cloud Code中使用这些功能,例如:

Parse.Cloud.define('deletePost', function(request, response) {
  var postID = request.params.postID;
  var query = new Parse.Query('post');
  query.get(postID).then(function (post) {
    if (post) {
      // post found
      var postOwner = post.get('user');
      if (postOwner.id == request.user.id) {
        // we let the owner delete their own posts

        // NOTE: need to use the master key to modify/delete posts
        Parse.Cloud.useMasterKey();

        post.destroy().then(function () {
          // TODO: delete all replies too?
          response.success();
        }, function (error) {
          response.error(error);
        });
      } else {
        response.error('Only the owner of a post can delete it!');
      }
    } else {
      // post not found, might as well respond with success
      response.success();
    }
  }, function (error) {
    response.error(error);
  }
});

答案 1 :(得分:0)

  

但是,由于默认情况下User表只对所有用户可读,   这不会成为恶意用户可以随机创建的问题   帖子和"索赔"它们是由另一个用户创建的,通过设置   用户字段给其他用户?

你可以玩curl来探索这个。

IMO - 你对_User类的世界阅读是正确的。所以呢。这是读。

当涉及到POST操作时,您将需要一个经过身份验证的会话作为相关用户。你不能通过声称自己是你在桌面上阅读的用户来发挥作用。

尝试在没有建立会话的情况下卷曲帖子作为用户。您将获得403或某些非法访问权限。响应。