POST body undefined导致node.js服务器关闭

时间:2015-08-22 01:53:25

标签: javascript node.js post express body-parser

我通过POST将用户名和密码发送到/ user / login路由上的Node.js API。这是功能:

module.exports.login = function(req, res) {
    User.findOne({email: req.body.email}, function(err, user) {
        if(err) throw err;

        if(!user) {
            res.json({success: false, message: 'Invalid username or password!'});
        } else {
            if(!bcrypt.compareSync(req.body.password, user.password)) {
                res.json({success: false, message: 'Invalid username or password!'});
            } else {
                var token = jwt.sign(user, config.secret, {
                    expiresInMinutes: 1440
                });

                res.json({success: true, token: new Buffer(token).toString('base64')});
            }
        }
    });
}

要获取post body变量,我正在使用body-parser模块。每当我发送没有电子邮件的POST请求时,req.body.email都会返回undefined,而mongoose会在数据库中找到第一个用户(没有电子邮件验证)。

这很好,因为它会检查密码并返回错误消息。问题是,当bcrypt.compareSyncreq.body.password时,undefined会返回错误,并使用以下内容崩溃node.js:

throw Error("Illegal arguments: "+(typeof s)+', '+(typeof hash));
Error: Illegal arguments: undefined, string

我可以先检查变量是否未定义但是必须有更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:4)

如果电子邮件未定义,则不应执行登录功能的任何部分 - 如果自动选择数据库中的第一封电子邮件,则不会出现主要安全漏洞。在传递给API函数之前检查值是否已定义,这实际上是处理问题的最佳方法。尝试:

module.exports.login = function(req, res) {
    if (req.body.hasOwnProperty('email') && req.body.hasOwnProperty('password')) {
        User.findOne({email: req.body.email}, function(err, user) {
            if(err) throw err;
            if(!user) {
                res.json({success: false, message: 'Invalid username or password!'});
            } else {
                if(bcrypt.compareSync(req.body.password, user.password)) {
                    var token = jwt.sign(user, config.secret, {
                        expiresInMinutes: 1440
                    });
                    res.json({success: true, token: new Buffer(token).toString('base64')});
                } else {
                    res.json({success: false, message: 'Invalid username or password!'});
                }
            }
        });
    }
}