Meteor帐户 - 密码客户端帐户创建安全性

时间:2015-12-18 06:17:47

标签: javascript security meteor meteor-accounts javascript-injection

我正在使用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
        });

    }
});

这很有效,而且是account-ui包的方式。问题是我可以绕过任何输入验证(我在一个只运行accounts-ui和accounts-password包的应用程序上检查了这个),只需在控制台中编写一个javascript命令,如下所示:

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

这将创建一个用户显示的电子邮件和密码,并将其登录。这似乎是一个巨大的缺陷与account-ui包,或mabey我只是缺少一些东西?有没有办法继续允许客户端帐户创建,同时确保您无法从控制台进行任何javascript注入以绕过输入检查?

1 个答案:

答案 0 :(得分:0)

对于对安全性有同样担忧的任何人,我发现有一个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函数。