Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Security Meteor:保护应用程序管理部分所需的SSR?_Security_Meteor_Meteor Accounts_Meteor Methods - Fatal编程技术网

Security Meteor:保护应用程序管理部分所需的SSR?

Security Meteor:保护应用程序管理部分所需的SSR?,security,meteor,meteor-accounts,meteor-methods,Security,Meteor,Meteor Accounts,Meteor Methods,我在Meteor.users集合中有我的扩展用户模型,我将大部分字段从该集合发布到客户端。每个用户都有一个isAdmin字段,默认设置为false 现在我有两个问题,它们是相互关联的: 如何确保只有在Meteor.users集合中的isAdmin字段设置为true时,才能呈现管理员使用的组件 如何确保Meteor.users集合上的isAdmin字段不能从客户端控制台修改 关于1。 我不太愿意将此字段发布到客户端,而只是在客户端评估isAdmin 我不确定是否有一些黑客通过控制台简单地

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

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

  • 如何确保只有在
    Meteor.users
    集合中的
    isAdmin
    字段设置为
    true
    时,才能呈现管理员使用的组件

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


  • 关于1。 我不太愿意将此字段发布到客户端,而只是在客户端评估
    isAdmin

    我不确定是否有一些黑客通过控制台简单地更改
    isAdmin
    ,以允许呈现仅用于客户端管理员的组件(或部分组件)。举例来说,我可以想象,这是有可能的

    我应该使用
    服务器端呈现
    来保护UI的管理部分吗


    关于2。 考虑一下这篇文章中关于概要文件编辑的第一段关于常见错误的内容。它表明,通过从控制台调用Meteor.users.update(Meteor.userId(),{$set:{'isAdmin':true}}),可以很容易地从客户端更改
    isAdmin

    当我运行它,登录到我的应用程序时,我得到
    更新失败:访问被拒绝

    但即使是官方文件也建议添加

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

    有一个错误,表明只要在服务器端检查
    isAdmin
    属性就足够了,如果您确保
    Meteor.methods
    仅用于服务器。但是它根本没有提到允许拒绝,而且它已经6岁了

    有谁能告诉我,今天到底是什么情况

    有谁能告诉我,今天到底是什么情况

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

    这里更重要的一点是确保方法和发布的安全,因为这些是用户可以随意处理应用程序的部分。对于那些不太安全的人:

    • 将中的
      ValidatedMethod
      用于方法
    • 编写一个工厂函数来创建类似于
      mdg:validated method
      的发布,以允许以混合方式进行基本检查
    • 两者:检查参数是否有效
    • 两者:检查用户是否存在
    • 两者都有:检查用户是否有足够的角色->I建议,因为它使权限级别检查更安全,因为它检查专用集合中是否存在id匹配,而不是检查用户集合中的标志(另外它将用户与角色分离!)
    • 抛出快速且大量:抛出任何可疑的不一致性,尝试用抛出错误覆盖任何未定义的状态
    • 使用每种方法和出版物的费率限制
    • 在启动时编写一个简单的健全性检查,确保所有方法和发布都有速率限制,您可以通过
      Meteor.server.method\u handlers
      Meteor.server.publish\u handlers
      在服务器上获取所有注册的方法/发布
    • 编写大量测试,尤其是与管理相关的方法,并尝试任何你能想到的奇怪和疯狂的输入,看看它是否被拒绝或导致任何奇怪的行为(这是你想要避免的)
    据我所知,你目前还没有集成ssr,如果你遵循上述步骤,你可以在不将ssr包含到你的应用程序中的情况下保护你的应用程序管理区域(由于附加配置等原因,ssr本身可能会引起很多头痛)


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

    我要强调的是,即使使用动态导入,UI本身(即模板)也几乎不可能安全。但数据和行动(如您所描述的出版物和方法)通常是关键所在。