我们使用以下函数根据客户要求验证密码。这在我们的开发环境和客户的暂存环境中都有效,但当推送到生产环境时,密码会随机失败。暂存和生产被认为是相同的,这使得我们很难弄清楚为什么它不起作用,因为我们无法访问生产环境。
密码需要验证以下内容:
- 至少1个大写字母和1个小写字母
- 至少1个数字(0-9)
- 至少10个字符长
- 包含以下字符之一-
!@#$%^&*()
(Shift+标准美国键盘上的任何数字) - 只要上述内容有效,就不应按特定顺序排列
代码在我们的开发环境中工作,因此它可能也适用于您。我们需要的是看看它可能失败的原因和
<?php
function isStrongPassword($pass, $char = 10) {
$bits = ['A-Z', 'a-z', '0-9',preg_quote('#$%^&*()','/')];
if (is_numeric($char) && strlen($pass) >= $char) {
foreach ($bits AS $bit) {
if (preg_match('@[' . $bit . ']@', $pass) == false) {
return false;
}
}
return true;
}
return false;
}
?>
将我的评论转化为答案。
似乎所有答案中的代码都可以使用lookahead翻译成一个正则表达式,如下所示:
/^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[!@#$%^&*()]).{10,}$/
4个lookahead (?=...)
中的每一个都确保存在一个大写字母、小写字母、数字和一个特殊字符。.{10,}
确保输入的最小长度为10。