1

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

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

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

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


关于1。

我很犹豫是否将此字段发布给客户端并在isAdmin客户端进行简单评估。

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

我应该使用它server-side rendering来保护我的 UI 的管理部分吗?


关于2。

考虑一下本文中关于常见错误的配置文件编辑的第一段。它表明可以通过从控制台调用轻松地从客户端更改。isAdminMeteor.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

有一个答案,表明只要isAdmin确定服务器端的属性就足够了Meteor.methods。但它根本不说话allow-deny,它已经6岁了。

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

4

1 回答 1

2

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

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

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

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

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

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

于 2019-05-31T09:51:02.613 回答