【问题标题】:Enforcing Password Requirements强制执行密码要求
【发布时间】:2011-05-31 03:53:07
【问题描述】:

我想检查用户是否成功满足以下要求:

  • 密码至少有 8 个字符
  • 由一个大写字母和一个小写字母组成

我该怎么做?

我正在使用下面的 PHP 脚本:

if ( strlen( $password ) < 8 ) {
     false
} else {
   if ( preg_match( "/[^0,9]/", $password ) ) {
     // how to check the upper case and lower case
   }
}

【问题讨论】:

  • 欢迎来到 StackOverflow!第一个问题很好。
  • 密码中需要有数字吗?

标签: php security passwords


【解决方案1】:

您可以使用正则表达式来做到这一点:

if (!preg_match('/^(?=[a-z])(?=[A-Z])[a-zA-Z]{8,}$/', $password))
{
    //error
}

【讨论】:

    【解决方案2】:

    使用preg_match("/[A-Z]/")preg_match("/[a-z]/")

    【讨论】:

      【解决方案3】:
      if( strlen($password) < 8 ) {
           return false;
      }
      if(preg_match("/[^0,9]/", $password)) {
           how to check the upper case and lower case
      }
      if($password == strtoupper($password) || $password == strtolower($password)){
      //pass fails because its either all upcase, or lowercase
      }
      

      【讨论】:

        【解决方案4】:
        if (
          strlen($password) >= 8) &&
          preg_match('/[A-Z]/', $password) > 0 &&
          preg_match('/[a-z]/', $password) > 0 )
        {
          /* Password validation passes, do stuff. */
        }
        else {
          /* Password validation fails, show error. */
        }
        

        【讨论】:

        • 你没有必须包含 "> 0",但由于 preg_match 返回一个整数而不是布尔值,我更愿意显式测试这种情况以防万一他们以后会改变它。
        【解决方案5】:

        您可以使用密码排名技术:

        $x = "a12ASD!@#$";
        $rank = Array();
        
        
        $rank['length'] = strlen($x);
        
        $matches = Array();
        preg_match_all("/([a-z]+)/", $x, $matches);
        $rank['lowercase'] = strlen(implode('', $matches[0]))/count($matches[0]);
        
        $matches = Array();
        preg_match_all("/([A-Z]+)/", $x, $matches);
        $rank['uppercase'] = strlen(implode('', $matches[0]))/count($matches[0]);
        
        $matches = Array();
        preg_match_all("/([0-9]+)/", $x, $matches);
        $rank['numbers'] = strlen(implode('', $matches[0]))/count($matches[0]);
        
        $matches = Array();
        preg_match_all("/([^a-zA-Z0-9]+)/", $x, $matches);
        $rank['symbols'] = strlen(implode('', $matches[0]))/count($matches[0]);
        
        
        echo "<pre>";
        var_dump($rank);
        echo "</pre>";
        

        【讨论】:

        • 当一个没有被使用时,由于/count()函数,它返回了一个关于除以0的错误。有什么想法可以在没有乱七八糟的代码的情况下解决这个问题吗?
        • @Tarquin:为什么不简单地使用 if/else 呢?不知道你所说的“代码混乱”是什么意思
        • 感谢您的回复!我正在努力申请 if 或 else,我应该检查什么,因为 $matches$matches[0] 都只返回 'Array' - 我也尝试使用其他一些但未能获得结果。 --- 我最终将函数调用为@function_name() 来抑制错误,并使用 if/else 将空变量设置为 0 作为补丁解决方案。
        【解决方案6】:

        可以使用trim,其实比正则表达式快很多

        if ( trim( $password, 'a..z') != '' && trim( $password, 'A..Z') != '' && strlen($password) >= 8 )
        {
          /* Password validation passes, do stuff. */
        }
        else {
          /* Password validation fails, show error. */
        }
        

        【讨论】:

        • 您的第一个案例将通过,即使通过率较低且其中没有数字。如果 pass 中有数字,则第二种情况不会通过
        • 现在它会验证即使它没有数字并且只有大写和小写字母
        • @Tudor Constantin:OP 没有提到数字
        • 他在示例代码中“说了”一些话。但是,不是我给了你反对票。我现在给了你一个赞成票
        【解决方案7】:
        preg_match('/[a-z]/', $password) && preg_match('/[A-A]/', $password)
        

        【讨论】:

          【解决方案8】:

          在php端验证用户是否满足密码要求,如下。

          // Given password
          $password = 'user-input-pass';
          
          // Validate password strength
          $uppercase = preg_match('@[A-Z]@', $password);
          $lowercase = preg_match('@[a-z]@', $password);
          $number    = preg_match('@[0-9]@', $password);
          $specialChars = preg_match('@[^\w]@', $password);
          
          if(!$uppercase || !$lowercase || !$number || !$specialChars || mb_strlen($password) < 8) {
              echo 'Password should be at least 8 characters in length and should include at least one upper case letter, one number, and one special character.';
          }else{
              echo 'Strong password.';
          }
          

          我给你的剧本;检查长度、复杂度(包含数字、大写、小写以及是否需要特殊字符)

          【讨论】:

            【解决方案9】:

            此函数允许您通过使用 preg_replace 中的 count 参数计算出现次数来设置最低要求:

              function password_validate($password, $min_length=8, $min_lowercases=1, $min_uppercases=1, $min_numbers=1, $min_specials=0) {
            
                preg_replace('#[a-z]#', '', $password, -1, $lowercases);
                preg_replace('#[A-Z]#', '', $password, -1, $uppercases);
                preg_replace('#[0-9]#', '', $password, -1, $numbers);
                preg_replace('#[^\w]#', '', $password, -1, $specials);
            
                return (mb_strlen($password) >= $min_length && $lowercases >= $min_lowercases && $uppercases >= $min_uppercases && $numbers >= $min_numbers && $specials >= $min_specials);
              }
            

            可以这样使用:

              if (!password_validate($new_password)) {
                echo 'Password did not meet requirements';
              }
            

            或通过要求:

              if (!password_validate($new_password, 6, 1, 0, 0, 0)) {
                echo 'Password did not meet requirements';
              }
            

            【讨论】:

              猜你喜欢
              • 2011-07-10
              • 2012-10-14
              • 1970-01-01
              • 1970-01-01
              • 2016-02-21
              • 2017-06-05
              • 2014-06-26
              • 2019-06-01
              • 1970-01-01
              相关资源
              最近更新 更多