用于密码验证的PHP Regex在不同环境中失败


PHP Regex for password validation failing in different environment

我们使用以下函数根据客户要求验证密码。这在我们的开发环境和客户的暂存环境中都有效,但当推送到生产环境时,密码会随机失败。暂存和生产被认为是相同的,这使得我们很难弄清楚为什么它不起作用,因为我们无法访问生产环境。

密码需要验证以下内容:

  1. 至少1个大写字母和1个小写字母
  2. 至少1个数字(0-9)
  3. 至少10个字符长
  4. 包含以下字符之一-!@#$%^&*()Shift+标准美国键盘上的任何数字)
  5. 只要上述内容有效,就不应按特定顺序排列

代码在我们的开发环境中工作,因此它可能也适用于您。我们需要的是看看它可能失败的原因和

<?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。