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

Cha*_*row 31 meteor

Meteor 0.5.8中引入了以下变化:

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

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

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

代替:

People.update({name:'Bob'}, {$set:{lastName:'Johns'}});
Run Code Online (Sandbox Code Playgroud)

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

Meteor 0.5.8变化的动机是什么?

lbe*_*ehr 28

来自Meteor博客:

允许/拒绝规则的更改

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

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

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

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

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

希望能给你更多的信息.