【问题标题】:Simple user checking in meteor, is this secure?简单的用户签入流星,这安全吗?
【发布时间】:2013-07-25 13:50:04
【问题描述】:

我有一个非常简单的应用程序,它不需要任何角色,只需一个或多个用户即可登录并使用站点的管理员。

我正在我的管理模板中做一个简单的检查,如下所示:

<template name="admin">
{{#if currentUser}}
{{loginButtons}}
  {{#if isUserAdmin}}
     show some stuff here...
  {{/if}}
{{ else }}
{{loginButtons}}
{{/if}}
</template>

然后在我的助手中我有:

Template.admin.isUserAdmin = function(){
  var adminEmail = Meteor.user().emails[0].address;
  if( adminEmail === "username@gmail.com"){
    return true;
  } else {
    return false;
    //add some logic for displaying error template.
  }
}

这足以保证应用程序的安全还是我还需要其他东西?

【问题讨论】:

    标签: javascript meteor


    【解决方案1】:

    这还不够。主要规则是:永远不要相信你的客户。客户端代码的任何部分都可以替换为其他任何部分 - 在您的情况下,isUserAdmin 函数可以修改为始终返回 true。

    为了安全起见,你需要在服务器端放置安全过滤器。

    1) 为只有管理员才能修改的数据设置写入/删除权限。见http://docs.meteor.com/#allow

    2) 如果您的某些数据不应该对所有用户可见,而只对管理员可见(例如您的用户电子邮件、产品的价格历史记录、未发表的文章等),请确保检查 @987654324 中的权限@ 称呼。例如:

    Meteor.publish('unpublishedArticles', function() {
        if(!this.userId) return null;
        var user = Meteor.users.findOne(this.userId);
        if(user.admin) return Articles.find({published: false});
        return null;
    });
    

    再次强调,在publish 中过滤数据很重要,因为subscribe 调用很容易被篡改。

    3) 此外,将您的电子邮件直接嵌入到客户端代码中是不明智的。使用admin = true 字段标记特权用户会更好(并且以后更容易使用)。

    这些步骤应该足以确保您的应用安全。

    【讨论】:

    • 这些都是非常好的建议。一个相关但不同的问题:您如何应用您建议的路由原则。这必须在客户端完成。这是否意味着没有安全的方法可以将某些路由限制为特定用户。我知道 Meteor.Router 中的过滤器,但它们是在客户端定义的。
    • 答案花了我 600 多个字符,所以我允许自己在这里复制您的问题:stackoverflow.com/questions/17874926/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    相关资源
    最近更新 更多