31

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 函数以及自动发布和不安全包来控制的。我喜欢能够从 Chrome JavaScript 控制台与数据库交互。

Meteor 0.5.8 变化的动机是什么?

4

1 回答 1

28

来自流星博客

更改允许/拒绝规则

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

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

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

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

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

希望能给你更多的信息。

于 2013-03-17T19:37:05.233 回答