【问题标题】:Meteor: SSR necessary to secure admin part of application?Meteor:保护应用程序管理部分所需的 SSR?
【发布时间】:2019-05-31 17:51:02
【问题描述】:

我在Meteor.users 集合中有我的扩展用户模型,我将大部分字段从该集合发布到客户端。每个用户都有一个isAdmin 字段,默认设置为false

现在我有两个问题,它们是相互关联的:

  1. 如果Meteor.users 集合中的isAdmin 字段设置为true,如何确保只能呈现用于管理员的组件?

  2. 如何确保不能从客户端控制台修改Meteor.users 集合上的isAdmin 字段?


关于1.

我很犹豫是否将此字段发布给客户端,只是在客户端评估isAdmin

我不确定控制台是否有一些骇人听闻的方式来简单地更改isAdmin 以允许呈现仅适用于 上的管理员的组件(或其中的一部分)客户。例如,我可以想象Object.defineProperty() 可以这样做。

我应该使用server-side rendering 来保护我的用户界面的管理部分吗?


关于2.

考虑一下article 中关于个人资料编辑 的第一段关于常见错误的内容。这表明 isAdmin 可以通过从控制台调用 Meteor.users.update(Meteor.userId(), {$set: {'isAdmin': true}}) 轻松地从客户端更改。

当我运行它并登录到我的应用程序时,我得到了update failed: Access denied

但是即使官方文档还是建议添加

// Deny all client-side updates on the Lists collection
Lists.deny({
  insert() { return true; },
  update() { return true; },
  remove() { return true; },
});

https://guide.meteor.com/security.html#allow-deny

有一个answer,表明只要确保Meteor.methods 是服务器专用的,只需检查服务器端的isAdmin 属性就足够了。但它根本不谈论allow-deny,它已经6岁了。

谁能告诉我,今天的真实情况如何?

【问题讨论】:

    标签: security meteor meteor-accounts meteor-methods


    【解决方案1】:

    谁能告诉我,今天的真实情况如何?

    我不会花太多精力来保护客户端上的管理 ui。当isAdmin 为 false 时,路由器级别的重定向就足够了。*

    这里更重要的是确保方法和发布的安全,因为这些是用户可以弄乱您的应用程序的部分。对于那些不够安全的人:

    • 使用来自mdg:validated-methodsValidatedMethod 作为方法
    • 编写一个工厂函数来创建类似于mdg:validated-method 的发布,以允许以mixin 样式进行基本检查
    • 两者:检查参数是否有效
    • 两者:检查用户是否存在
    • 两者:检查用户是否有足够的角色 -> 我推荐alanning:roles,因为它使权限级别检查更加安全,因为它检查专用集合中是否存在 id-match,而不是检查用户集合中的标志(再加上它使用户与角色分离!)
    • 快速和大量抛出:抛出任何可疑的不一致,尝试用抛出错误覆盖任何未定义的状态。
    • 使用ddp-rate-limiter 每种方法和发布的速率限制
    • 在启动时编写一个简单的健全性检查,以确保所有方法和发布都受到速率限制,您可以通过Meteor.server.method_handlersMeteor.server.publish_handlersMeteor.startup 的服务器上获取所有注册的方法/发布
    • 大量编写测试,尤其是与管理相关的方法,并尝试任何你能想到的奇怪和疯狂的输入,看看它是否被拒绝或导致任何奇怪的行为(你想避免)

    据我了解您的问题,您目前尚未集成 ssr,如果您按照上述步骤操作,您可以在不将 ssr 包含到您的应用程序中的情况下大量保护应用程序的管理区域(这本身可能会引起很多头痛由于额外的配置等)。

    *如果您决定使用推荐的alanning:roles 包,您最好在客户端也使用它来检查用户的角色。

    【讨论】:

    • 我要强调的是 UI 本身(即模板)几乎不可能保护,即使是动态导入。但数据和行动(即如您所描述的出版物和方法)通常是危险的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    • 2016-01-04
    • 2020-12-25
    • 1970-01-01
    相关资源
    最近更新 更多