服务器上的流星方法

时间:2014-06-27 14:37:13

标签: javascript jquery mongodb security meteor

当我为集合编写流星方法时,我通常将它们放在共享目录中,以便可以在客户端上模拟它们以获得快速的速度。但是这样安全吗?我应该把方法放在服务器目录中,如果是这样的话?

2 个答案:

答案 0 :(得分:0)

是肯定的。你可以使它安全并拥有集合的共享目录。只有在服务器和客户端都有集合时,流星延迟补偿功能才有效。 如果您使用共享代码进行收藏,则必须执行这些操作。

关于流星安全的更多信息。 http://security-resources.meteor.com/

答案 1 :(得分:0)

这不是流星应该适用于一般情况的方式。您应该只实现大多数收集方法(更新,插入,删除)客户端,并检查更新权限服务器端。

如果您有一些包含某些帖子的集合,请不要制作Meteor.call('addNewPost', newPost)Posts.insert(...)流星方法服务器端的addNewPost。这将是REST API的经典方式;但这是流星:)

您直接向客户端寻找Posts.insert(...)。这将立即显示在客户端,并将尝试更新基本服务器端。

然后在服务器端,你必须设置广泛的权限:

Posts.allow({

    'insert': function(userId, doc) {
        // Check if the user exists
        // if he has the right to insert
        // if what he tries to insert is ok for you
        // ...
    },

    'update': function(userId, docs, fields, modifier) {
        // same, width the fields, the doc, the user...
    },

    'remove': function(userId, docs) {
        // same again
    }

});

您可以对集合上的任何内容allow()deny()进行操作。这可能看起来很奇怪,但这是良好延迟补偿的真正基础。如果您不知道如何设置权限,则可能是HUDGE安全漏洞。但如果你知道如何做到这一点,那绝对没有安全问题。

(我的建议是拒绝除了你想要允许的具体元素之外的所有内容)

所以:

  1. 用户使用客户端方法更新其数据库客户端:myCollection.update()
  2. 他看到了结果
  3. meteor将其发送到服务器的魔力
  4. 服务器检查是否允许
  5. 如果是,请写入基地并发送给其他订阅者
  6. 如果没有,请发送请求以还原更改客户端