繁体   English   中英

流星帐户密码客户端帐户创建安全性

[英]Meteor accounts-password client-side account creation security

我正在使用Meteor创建一个Web应用程序,并且我对帐户创建的安全性有些担忧。 我知道我可以使用Meteor方法解决此问题,但是这样做的好处是您可以在创建帐户后立即登录用户。

我目前没有任何东西可以验证我的输入,以使其变得简单:

Template.register.events({
    'submit form': function (e) {
        e.preventDefault();

        var userInfo = {
            email: e.target.registerEmail.value,
            password: e.target.registerPassword.value,
            password_confirmation: e.target.registerPasswordConfirmation.value
        };

        check(userInfo, {
            email: String,
            password: String,
            password_confirmation: String
        });

        //Do some checks on the passwords and email before trying to create account
        Accounts.createUser({
            email: userInfo.email,
            password: userInfo.password,
            profileComplete: false
        });

    }
});

这很好用,这是accounts-ui程序包的工作方式。 问题是,我可以通过在控制台中像下面这样简单地编写一个javascript命令来绕过任何输入验证(并且我也在仅运行accounts-ui和accounts-password软件包的应用程序上检查了此验证):

Accounts.createUser({
    email: "NotAnEmail",
    password: "123"
});

这将使用所示的电子邮件和密码创建一个用户并登录。这似乎是accounts-ui程序包的巨大缺陷,或者也许我只是缺少了什么? 在确保您不能从控制台进行任何JavaScript注入来绕过输入检查的同时,还有什么方法仍然允许客户端帐户创建?

对于任何对安全性有同样担忧的人,我发现有一个Meteor挂钩,可以在发送Accounts.createUser请求之后使用它来验证输入。 当我仅验证电子邮件字段并添加额外的字段profileComplete时,代码就是这样。

Accounts.onCreateUser(function(options, user) {
    if (! validateEmail(options.email))
        throw new Meteor.Error(400, 'There was an error processing your request');

    user.profileComplete = options.profileComplete;
    return user;
});

validateEmail是我定义的自定义函数,而不是本机Meteor函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM