【问题标题】:Create preg_match for password validation allowing (!@#$%)为密码验证创建 preg_match 允许 (!@#$%)
【发布时间】:2012-08-06 02:55:57
【问题描述】:

我想创建一个preg_match 函数来验证我的密码,但我不知道如何编写它以允许使用以下特殊字符:!@#$%。

if(!preg_match(?????)$/', $password))

这是我想在正则表达式中使用的密码规则:

  • 可能包含字母和数字
  • 必须至少包含 1 个数字和 1 个字母
  • 可能包含以下任何字符:!@#$%
  • 必须是 8-12 个字符

感谢您提供的任何帮助。

【问题讨论】:

  • 请考虑允许更长的密码,我更喜欢我的密码长度为 20 多个字符,允许这样做不会对您造成伤害。我不了解具有最大长度的网站 - 您将它们存储为散列,那么有什么问题?
  • @Dragon 我已将最大字符数增加到 50 个。这是一个简单的网站,我想我只是认为 8-12 个字符更容易让人们记住,并且不太可能需要重置密码。但是就像你说的那样,密码被加密了,这真的没什么大不了的。
  • 我让 lastpass 替我记住我所有的密码 :-)
  • 8-12 仍然足够短,可以很容易地蛮力。虽然它们对因果破解尝试效果很好,但 16 个字符的密码中有 90% 可以使用现代混合暴力破解技术在一小时内破解(如果您知道最大密码长度和字符范围,这将变得更加容易);因此,我建议上限为 32-64 个字符,并可能包含 2 因素身份验证,特别是如果这是为了保护任何类型的特别敏感数据(PPI、PCI、HIPPA 等)。

标签: php regex passwords preg-match


【解决方案1】:

我认为应该是这样的:

if(!preg_match('/^(?=.*\d)(?=.*[A-Za-z])[0-9A-Za-z!@#$%]{8,12}$/', $password)) {
    echo 'the password does not meet the requirements!';
}

在开始之间 -> ^
结束 -> $
字符串中必须至少有一个数字 -> (?=.*\d)
和至少一个字母 -> (?=.*[A-Za-z])
它必须是数字、字母或以下之一:!@#$% -> [0-9A-Za-z!@#$%]
并且必须有 8-12 个字符 -> {8,12}

正如 user557846 对您的问题的评论,我还建议您允许更多字符,我通常(如果我使用最大值)至少需要 50 个 :)

顺便说一句,你可能想看看this regex tutorial

【讨论】:

  • 谢谢!这对我有用。并感谢您解释它的每个部分。这真的有助于我更好地理解这一点。我还探索了您建议的教程,这看起来是我下次处理正则表达式时的一个很好的资源。我已经制作了最多 50 个字符。
【解决方案2】:
preg_match('/^(?=.*\d)(?=.*[@#\-_$%^&+=§!\?])(?=.*[a-z])(?=.*[A-Z])[0-9A-Za-z@#\-_$%^&+=§!\?]{8,20}$/',$password)
  • 至少一个小写字符
  • 至少一个大写字符
  • 至少一位数
  • 至少有一个 @#-_$%^&+=§! 的特殊符号?

【讨论】:

  • Thomas 的回答比 r3bel 的解释更好。
  • /^(?=.*\d)(?=.*[.*@#\-_$%^&+=§!\?])(?=.*[az ])(?=.*[AZ])[0-9A-Za-z.*@#\-_$%^&+=§!\?]{8,20}$/ 如果我添加它将起作用.和 *
【解决方案3】:

我喜欢 r3bel 的回答,所以我玩了一下,最后得到了以下作为密码检查功能:

function password_strength_check($password, $min_len = 8, $max_len = 70, $req_digit = 1, $req_lower = 1, $req_upper = 1, $req_symbol = 1) {
    // Build regex string depending on requirements for the password
    $regex = '/^';
    if ($req_digit == 1) { $regex .= '(?=.*\d)'; }              // Match at least 1 digit
    if ($req_lower == 1) { $regex .= '(?=.*[a-z])'; }           // Match at least 1 lowercase letter
    if ($req_upper == 1) { $regex .= '(?=.*[A-Z])'; }           // Match at least 1 uppercase letter
    if ($req_symbol == 1) { $regex .= '(?=.*[^a-zA-Z\d])'; }    // Match at least 1 character that is none of the above
    $regex .= '.{' . $min_len . ',' . $max_len . '}$/';

    if(preg_match($regex, $password)) {
        return TRUE;
    } else {
        return FALSE;
    }
}

最大/最小长度是默认或可调整的,每个要求都是默认开启的,但可以关闭,我想支持任何符号,所以最后一个要求是“任何不是上述类型之一”,而不是而不是一组固定的符号。

【讨论】:

    【解决方案4】:

    我已经开发了一个完整的正则表达式来进行更复杂的检查

    /^(?=.*\d)(?=.*[A-Za-z])(?=.*[A-Z])(?=.*[a-z])(?=.*[ !#$%&'\(\) * +,-.\/[\\] ^ _`{|}~\"])[0-9A-Za-z !#$%&'\(\) * +,-.\/[\\] ^ _`{|}~\"]{8,50}$/
    

    基本上,我检查密码是否有 1 个数字、1 个大写字母、1 个小写字母和 1 个特殊字符。我希望这对寻找正则表达式的人有所帮助。

    【讨论】:

      【解决方案5】:
      if (!preg_match('/^(?=.*\d)(?=.*[A-Za-z])(?=.*[!@#$%])[0-9A-Za-z!@#$%]
      {6,15}$/',($_POST['password']))) {
          $message='Password must contain 6 characters of letters, numbers and 
          at least one special character.';
      }
      

      【讨论】:

        【解决方案6】:

        我已经在hook_form_validate 中使用我的drupal 自定义表单完成了这项工作,这里的密码应该是6 个字母、数字和至少一个特殊字符的字符。

        <?
        if (!preg_match('/^(?=.*\d)(?=.*[A-Za-z])(?=.*[!@#$%])[0-9A-Za-z!@#$%]{6,15}$/', $form_state['values']['pass'])) {
            form_set_error('pass', t('Password must contain 6 characters of letters, numbers and at least one special character.'));
        }
        ?>
        

        【讨论】:

          【解决方案7】:

          另一种方式

          让我们看不同,我相信用户可以使用密码中的所有ASCII有效字符(32 &lt; ascii_code &lt; 127),并创建了一个检查ASCII表中所有字符的函数!

          function check($pass, $i = 0){
               if(strlen($pass) > $i)
                   return (0rd(pass[$i]) > 32 and 0rd(pass[$i]) < 127) and check($pass, $i + 1);
          }
          

          用法

          if(!check($_POST["password"])){
              echo "password is wrong";
          }
          

          【讨论】:

            【解决方案8】:

            查找字符类,这是正则表达式的基本功能。

            【讨论】:

            • 这不是一个答案,尤其是与接受的答案相比。也许您可以扩展它,而不仅仅是告诉某人搜索某些东西。谢谢。
            【解决方案9】:
            if(!preg_match('/^(?=.*\d)(?=.*[A-Za-z])[0-9A-Za-z!@#$%]{8,12}$/', $password)) {
                echo 'the password does not meet the requirements!';
                }
            

            在上面的陈述中..因此存在什么可能的密码?

            【讨论】:

            • 请帮帮我..因为我输入了不同的字符但它不存在.."密码不符合要求!
            • if(!preg_match('/^(?=.*\d)(?=.*[A-Za-z])[0-9A-Za-z!@#$% ]{8,12}$/', $password)) { echo '密码不符合要求!'; }
            • 在上述声明中......任何人都可以给我一个适合我的“preg_match密码”的密码..因为我输入了不同的密码组合但它无法提交..
            猜你喜欢
            • 2013-03-15
            • 2014-12-19
            • 1970-01-01
            • 2016-10-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多