Meteor允许我从任何地方订阅,安全漏洞

时间:2015-08-18 03:22:11

标签: security meteor ddp

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

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

1 个答案:

答案 0 :(得分: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}});
  }
});

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