了解“不允许。不受信任的代码只能按ID更新文档”。流星错误

时间:2013-03-17 18:28:07

标签: meteor

Meteor 0.5.8中,引入了以下更改:

  

调用更新并删除不受信任代码中的集合函数   可能不再使用任意选择器。您必须指定一个   从客户端调用这些函数时的文档ID(除了   在方法存根中。

现在,如果您想从客户端控制台向数据库推送任意更新,您必须执行以下操作:

People.update({_id:People.findOne({name:'Bob'})['_id']}, {$set:{lastName:'Johns'}});

而不是:

People.update({name:'Bob'}, {$set:{lastName:'Johns'}});

我认为通过将Meteor.Collection.allow和.deny函数与autopublish和insecure软件包一起设置来控制此安全问题。我喜欢能够通过Chrome JavaScript控制台与数据库进行交互。

Meteor 0.5.8变化的动机是什么?

1 个答案:

答案 0 :(得分:28)

来自Meteor blog

  

允许/拒绝规则的更改

     

从0.5.8开始,仅客户端代码(如事件处理程序)一次只能更新或删除单个文档,由_id指定。方法代码仍然可以使用任意Mongo选择器一次操作任意数量的文档。要从事件处理程序运行复杂的更新,只需使用Meteor.methods定义一个方法并从事件处理程序中调用它。

     

此更改显着简化了允许/拒绝API,鼓励更好的应用程序结构,避免潜在的DoS攻击,攻击者可以强制服务器执行大量工作以确定操作是否已获得授权,并修复安全问题由@ jan-glx报道。

     

要更新代码,请更改允许和拒绝处理程序以获取单个文档而不是文档数组。这应该可以显着简化您的代码。还要检查在使用Mongo选择器的事件处理程序中是否有任何更新或删除调用(这种情况非常罕见),如果是,请将它们移动到方法中。有关详细信息,请参阅updateremove文档。

所以基本上,从我的观点来看,你几乎从不希望行为能够在没有任何特定知识的情况下(例如文档的id)更新和删除客户端的任意文档集。

当原型设计 - 我猜你正在做的事情 - 我想它可能会妨碍你,但是如果你想让你的代码投入生产,我相信优点胜过缺点。这也归结为在此更改后更容易指定的安全声明(allowdeny)。

希望能为您提供更多信息。