【问题标题】:Understanding "Not permitted. Untrusted code may only update documents by ID." Meteor error理解“不允许。不受信任的代码只能按 ID 更新文档。”流星错误
【发布时间】:2013-03-06 01:29:54
【问题描述】:

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 变化的动机是什么?

【问题讨论】:

    标签: meteor


    【解决方案1】:

    来自Meteor blog

    允许/拒绝规则的更改

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

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

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

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

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

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

    【讨论】:

    • 几周前我刚开始阅读一些较小的在线 Meteor 教程,并注意到它们的更新/删除示例中存在错误。今天晚上我开始阅读“Meteor.js JavaScript 框架入门”,它也有第一个使用不再工作的删除的示例。适合他们写关于仍处于预览阶段的框架的书籍 :) 开个玩笑,到目前为止它看起来像是一本很棒的书。即使它刚刚在 2012 年 12 月发布,也只能指望它不会跟上如此快速发展的框架。
    猜你喜欢
    • 2013-12-11
    • 2015-07-12
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多