在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变化的动机是什么?
答案 0 :(得分:28)
来自Meteor blog:
允许/拒绝规则的更改
从0.5.8开始,仅客户端代码(如事件处理程序)一次只能更新或删除单个文档,由_id指定。方法代码仍然可以使用任意Mongo选择器一次操作任意数量的文档。要从事件处理程序运行复杂的更新,只需使用Meteor.methods定义一个方法并从事件处理程序中调用它。
此更改显着简化了允许/拒绝API,鼓励更好的应用程序结构,避免潜在的DoS攻击,攻击者可以强制服务器执行大量工作以确定操作是否已获得授权,并修复安全问题由@ jan-glx报道。
要更新代码,请更改允许和拒绝处理程序以获取单个文档而不是文档数组。这应该可以显着简化您的代码。还要检查在使用Mongo选择器的事件处理程序中是否有任何更新或删除调用(这种情况非常罕见),如果是,请将它们移动到方法中。有关详细信息,请参阅update和remove文档。
所以基本上,从我的观点来看,你几乎从不希望行为能够在没有任何特定知识的情况下(例如文档的id)更新和删除客户端的任意文档集。
当原型设计 - 我猜你正在做的事情 - 我想它可能会妨碍你,但是如果你想让你的代码投入生产,我相信优点胜过缺点。这也归结为在此更改后更容易指定的安全声明(allow
和deny
)。
希望能为您提供更多信息。