【问题标题】:Regex password validation not working - javascript正则表达式密码验证不起作用 - javascript
【发布时间】:2021-03-24 17:31:19
【问题描述】:

我有下面的javascript。我正在尝试制定密码验证规则以具有以下内容:

  • 至少 12 个字符长(有效)
  • 至少 1 封信(有效)
  • 至少 1 个大写字母(无效)
  • 至少 1 位数字(有效)
  • 至少 1 个特殊字符(无效)

能否请我指点一下如何使大写和特殊字符验证正常工作?


// Register Handle
router.post('/register', (req, res) => {
    const { name, email, password, password2, userType } = req.body;

    let errors = [];

    // Check required fields
    if(!name || !email || !password || !password2 || !userType){
        errors.push({ msg: 'Please fill in all fields'})
    }

    // Check if passwords match
    if(password !== password2) {
        errors.push({ msg: 'Passwords do not match' });
    }

    // Check password length
    if(password.length < 12) {
        errors.push({ msg: 'Password should be at least 12 characters long' });
    }

    // Check if password contains at least 1 letter
    if(password.search(/[a-z]/i) < 0){
        errors.push({ msg: 'Password should contain at least one letter' });
    }

    // Check if password contains at least 1 Uppercase letter
    if(password.search(/[A-Z]/i) < 0){
        errors.push({ msg: 'Password should contain at least one uppercase character' });
    }

    // Check if password contains at least 1 number
    if(password.search(/[0-9]/) < 0){
        errors.push({ msg: 'Password should contain at least one number' });
    }

    // Check if password contains at least 1 special character
    if(password.search() < 0){
        errors.push({ msg: 'Password should contain at least one number' });
    }

    if(errors.length > 0) {
        res.render('register', {
            errors,
            name,
            email,
            password,
            password2,
            userType
        })
    } else {
        // Passed Validation
        User.findOne({ email: email })
            .then(user => {
                if(user) {
                    // User exists
                    errors.push({ msg: 'Email already registered' });
                    res.render('register', {
                        errors,
                        name,
                        email,
                        password,
                        password2,
                        userType
                    })
                } else {
                    const newUser = new User({
                        name,
                        email,
                        password,
                        userType
                    });

                    // Hash Password
                    bcrypt.genSalt(10, (err, salt) => bcrypt.hash(newUser.password, salt, (err, hash) =>{
                        if(err) throw err;
                        // Sets password to hash
                        newUser.password = hash;

                        // Save user
                        newUser.save()
                            .then(user => {
                                req.flash('success_msg', 'Registration successful! Login to continue')
                                res.redirect('/auth/login')
                                return;
                            })
                            .catch(err => console.log(err));
                    }))
                }
            })
    }
});


【问题讨论】:

  • 从信件检查中删除 i 标志。当您专门检查大小写时,它使正则表达式不区分大小写,这没有意义。
  • 谢谢!那行得通。你知道我如何对特殊字符进行验证吗?
  • /\W/ 匹配任何非字母数字字符。 this fiddle 你也可能受益,我为另一个有点类似的问题做了它。

标签: javascript html node.js regex security


【解决方案1】:

字母和数字检查应更新如下:

    // Check if password contains at least 1 letter
    if(/[a-z]/i.test(password)){
        errors.push({ msg: 'Password should contain at least one letter' });
    }

    // Check if password contains at least 1 Uppercase letter
    if(/[A-Z]/.test(password)){
        errors.push({ msg: 'Password should contain at least one uppercase character' });
    }

    // Check if password contains at least 1 number
    if(/[0-9]/.test(password)){
        errors.push({ msg: 'Password should contain at least one number' });
    }

在检查表达式是否可以匹配字符串中的任何内容时,最好使用test 而不是search,并且/[A-Z]/i 不区分大小写地匹配任何字母。

附:如果要检查特殊字符,请参阅Check for special characters in string。有很多方法可以匹配 JavaScript 中的特殊字符。

【讨论】:

  • 谢谢!一个问题 - 为什么使用“测试”而不是“搜索”更好?
  • @Jay test 立即返回一个布尔值。
猜你喜欢
  • 2011-03-01
  • 2012-11-03
  • 2015-11-30
  • 2021-06-18
  • 1970-01-01
  • 2015-03-27
  • 2014-04-08
  • 2013-06-10
  • 1970-01-01
相关资源
最近更新 更多