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

时间:2016-04-29 07:28:18

标签: php regex passwords

我们使用以下功能根据客户要求验证密码。这适用于我们的开发环境以及客户登台环境,但是当推送到生产密码时,随机失败。分段和生产假设是相同的,并且很难弄清楚它为什么不起作用,因为我们无法访问生产环境。

密码需要验证以下内容:

  1. 至少1个大写字母和1个小写字母字符
  2. 至少1位数字(0-9)
  3. 至少10个字符
  4. 包含以下字符中的一个 - !@#$%^&*() Shift +标准美国键盘上的任何数字数字)
  5. 只要上述验证
  6. ,就应该没有特别的顺序

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

    <?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;
           }
    ?>
    

1 个答案:

答案 0 :(得分:0)

将我的评论翻译成答案。

似乎所有代码中的代码都可以使用lookaheads转换为单个正则表达式:

/^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[!@#$%^&*()]).{10,}$/

4个前瞻(?=...)中的每一个都确保存在大写字母,小写字母,数字和特殊字符。 .{10,}确保输入的最小长度为10。