2

所以我制作了一个流星应用程序,并删除了自动发布和不安全的包,现在为了从我的收藏中接收数据,我必须在客户端订阅它们。我还有一个 python 程序,它使用python-meteor包通过 ddp 与我的流星服务器通信,在其中我只需订阅我的集合并可以完全访问我的所有数据,我还可以通过 Meteor.calls 调用函数服务器。这很好,但我不禁觉得这是一个主要的安全漏洞,任何人都可以编写一个客户端并订阅我的集合并一时兴起获取我的所有数据,如果他们猜对了集合名称。

有没有办法只让某些客户端订阅集合并执行服务器调用?

4

1 回答 1

4

是的,您应该为所有发布者和方法添加安全检查。

这是一个示例发布者,可确保用户在收到与该组相关的任何帖子之前已登录并且是该组的成员:

Meteor.publish('postsForGroup', function(groupId) {
  check(groupId, String);

  // make sure the user is a member of the group
  var group = Groups.findOne(groupId);
  if (!_.contains(group.members, this.userId))
    throw new Meteor.Error(403, 'You must be a member of the group!');

  return Posts.find({groupId: groupId});
});

这是一个示例方法,可确保在允许更改组名之前用户已登录并且是组的管理员:

Meteor.methods({
  'groups.update.name': function(groupId, name) {
    check(groupId, String);
    check(name, String);

    // make sure the user is an admin of the group
    var group = Groups.findOne(groupId);
    if (!_.contains(group.admins, this.userId))
      throw new Meteor.Error(403, 'You must be an admin of the group!');

    // make sure the name isn't empty
    if (!name.length)
      throw new Meteor.Error(403, 'Name can not be empty!');

    return Groups.update(groupId, {$set: {name: name}});
  }
});

需要注意的一个细节:如果您使用的是 Iron 路由器,请注意不要在发布者中造成任何错误。这样做,将导致waitOn永远不会回来。如果您认为在正常操作下可能会引发错误,那么我建议您return this.ready()不要throw new Meteor.Error在您的发布者中。

于 2015-08-18T03:40:58.253 回答