你如何保护客户端MongoDB API?

时间:2012-04-11 22:45:22

标签: meteor

我不希望我的所有用户都能插入/销毁数据。

4 个答案:

答案 0 :(得分:33)

虽然还没有记录的方法可以做到这一点,但这里有一些代码可以做你想要的:

Foo = new Meteor.Collection("foo");
...
if (Meteor.is_server) {
   Meteor.startup(function () {
       Meteor.default_server.method_handlers['/foo/insert'] = function () {};
       Meteor.default_server.method_handlers['/foo/update'] = function () {};
       Meteor.default_server.method_handlers['/foo/remove'] = function () {};
   });
}

这将禁用默认的insert / update / remove方法。客户端可以尝试插入数据库,但服务器将不执行任何操作,客户端将在服务器响应时注意并删除本地创建的项目。

插入/更新/删除仍然可以在服务器上运行。您需要使用在服务器上运行的Meteor.methods来完成任何数据库写入。

当认证分支到达时,所有这些都将改变。一旦发生这种情况,您将能够提供验证器来检查和授权服务器上的数据库写入。这里有更多细节:http://news.ycombinator.com/item?id=3825063

答案 1 :(得分:21)

[更新] 现在有一个官方的,有文档证明的Auth Package,它提供了不同的解决方案来保护集合。

在CRUD级别:

  

[Server] collection.allow(options)和collection.deny(options)。限制此集合上的默认写入方法。在集合上调用其中任何一个后,无论不安全的软件包如何,该集合上的所有写入方法都会受到限制。

还有insecure来删除客户端的完全写入权限。

来源:Getting Started with Auth(感谢@ dan-dascalescu)


[OLD ANSWER]

显然正在使用Auth Package(?),应该避免任何用户像现在一样对db进行完全控制。还有人建议通过定义自己的突变(方法)来确定现有解决方案(解决方法),如果他们试图执行未经授权的操作,则会使其失败。我没有得到更好的但我认为这通常是必要的,因为我怀疑Auth Package会让你在行级实现通常的auth逻辑,但可能只在CRUD方法上实现。将不得不看看开发者必须说些什么。

[编辑] 发现似乎证实了我的想法的东西:

  

目前,客户端获得对该集合的完全写入权限。他们可以执行任意Mongo更新命令。构建身份验证后,您将能够限制客户端对插入,更新和删除的直接访问。我们还在考虑验证器和其他类似ORM的功能。

这个答案的来源:

Accessing to DB at client side as in server side with meteor

https://stackoverflow.com/questions/10100813/data-validation-and-security-in-meteor/10101516#10101516

答案 2 :(得分:9)

更简洁的方式:

_.each(['collection1', 'collection2'], function(collection){
    _.each(['insert','update', 'remove'], function(method){
      Meteor.default_server.method_handlers['/' + collection + '/' + method] = function(){}
    });
});

或使其更具惯用性:

延伸流星:

_.extend(Meteor.Collection.prototype, {
  remove_client_access: function(methods){
    var self = this;
    if(!methods) methods = ['insert','update','remove'];
    if(typeof methods === 'String') methods = [methods];
    _.each(methods, function(method){
      Meteor.default_server.method_handlers[self._prefix + method] = function(){}
    });
  }
});

通话更简单:

List.remove_client_access() // restrict all
List.remove_client_access('remove') //restrict one
List.remove_client_access(['remove','update']) //restrict more than one

答案 3 :(得分:1)

我是Meteor的新手,但到目前为止我遇到的是这两点

  1. 您可以通过在服务器端find命令中向publish命令添加参数来限制客户端可以在数据库中访问的内容。然后,当客户端调用Collection.find({})时,返回的结果将与服务器端的结果相对应,例如Collection.find({user: this.userId})(另请参阅Publish certain information for Meteor.users and more information for Meteor.userhttp://docs.meteor.com/#meteor_publish)< / p>

  2. 内置的一件事(我有流星0.5.9)是客户端只能通过id update项,而不是使用选择器。如果尝试不符合,则会在客户端上的控制台上记录错误。 403: "Not permitted. Untrusted code may only update documents by ID."(见Understanding "Not permitted. Untrusted code may only update documents by ID." Meteor error)。

  3. 鉴于数字2,您需要在服务器端使用Meteor.methods来使用Meteor.call向客户端提供远程过程调用。