了解流星错误"Not permitted. Untrusted code may only update documents by ID."



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

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

所以现在如果你想从客户端控制台推送任意更新到db,你必须这样做:

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

代替:

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

我认为这个安全问题可以通过设置Meteor.Collection.allow和.deny函数与自动发布和不安全包一起控制。我喜欢能够从Chrome JavaScript控制台与数据库进行交互。

流星0.5.8改动的动机是什么?

From the Meteor blog:

允许/拒绝规则的修改

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

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

要更新代码,请将allow和deny处理程序更改为接受单个文档而不是文档数组。这将大大简化您的代码。还要检查是否在使用Mongo选择器的事件处理程序中有任何更新或删除调用(这是相当罕见的),如果是,将它们移到方法中。详细信息请参见更新和删除文档。

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

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

希望能给你更多的信息

相关内容

最新更新