前端密码策略验证总是失败怎么办?
我在做用户注册页面时要实现密码复杂度验证,要求必须包含大写字母、数字和特殊符号,且长度至少8位。但测试时发现符合要求的密码也会被拦截。
我写了这样的验证函数:
function checkPassword(password) {
const regex = /[A-Z]/.test(password) &&
/[0-9]/.test(password) &&
/[!@#$%^&*]/.test(password);
return password.length >= 8 && regex;
}
当测试密码”Abc123!@”时能通过,但”Abcdefg1!”(正好8个字符)却报错。发现是最后一个字符被截断了?明明长度没问题啊。有没有更好的正则写法能一次性验证所有条件?
&&,但这里应该用逻辑与&&,不过更好的办法是直接用一个完整的正则表达式来验证。我建议你改成这样:
解释一下这个正则表达式的含义:
-
^和$表示从头到尾匹配整个字符串-
(?=.*[A-Z])确保至少有一个大写字母-
(?=.*[0-9])确保至少有一个数字-
(?=.*[!@#$%^&*])确保至少有一个特殊符号-
.{8,}确保总长度大于等于8这种方式的好处是一次性验证所有条件,不需要分开写多个正则表达式再拼接逻辑。你之前的写法中,可能是因为按位与的优先级问题导致逻辑判断出错,尤其是当密码正好满足边界条件时容易出问题。
另外提一句,前端校验虽然能提升用户体验,但后端也一定要做同样的校验,毕竟前端的东西用户是可以绕过的。我之前就踩过类似的坑,用户直接改了前端代码就绕过了密码规则,最后数据库里存了一堆弱密码。
"Abcdefg1!" 这种应该能过,检查下你前端有没有自动 trim 或者别的处理把最后一个字符干掉了。