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

标签 javascript node.js backbone.js marionette parse-platform

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

我的担忧是:

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

他们有this example TODO appthe documentation 中未显示云代码以确保 Todo 分配给的 User 是当前登录的用户。

现在我浏览了the code我开始认为,无论何时保存一个对象,它都会与用户相关联。谁能解释为什么这个应用程序工作以及它如何将 TodoUser 相关联?

更新:没关系,我在他们的代码中找到了指定用户保存待办事项的位置。我的问题是,是什么阻止用户编写使用其他用户 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. 他们是否可以传递用户的 objectId 而不是整个 User 对象,即使 Todo 上的 user 字段也是如此s 表需要 _User
  2. 我相信他们也可以创建一个新的用户对象并将其分配给该对象...我正在尝试考虑这会成为问题的场景,但我现在不能。

如果有人可以确认或提供对其中任何一个有帮助的解决方案。现在要尝试测试 #1。

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

  1. 如果 Todo 表上的 user 字段需要一个 _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();
    

这正是我所担心的。 我能够成功地将 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/

相关文章:

javascript - 如何让两个promise同步执行?

javascript - 主干从模型与集合中获取数据

javascript - 纯 JavaScript 替代 jQuery 的 .remove()

javascript - 将 className 设置为映射元素中的特定状态

javascript - AngularJS:将对象从指令传递到 Controller

javascript - 即使我可以在开发人员工具(React&Electron)中看到Javascript undefined字段

Node.js 工作农场和队列管理

node.js - 如何将 live-reload 添加到我的 nodejs 服务器

javascript - Marionette 如何将渲染 View 附加到 DOM

collections - Backbone - 限制集合中显示的项目数