PHP -> 正则表达式 | 密码验证不起作用

3

我使用这个(几乎)复杂的密码验证:

function is_password($password) {
    return preg_match("^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,20}$", $password);
}

所以它必须包含:
  • 0-9中的一个数字,
  • 一个小写字符,
  • 一个大写字符,
  • 至少6个字符
  • 最多20个字符

这似乎不起作用。每当我输入某些字符,如etojcb时,如果允许的长度正确,则函数返回true。因此,未验证大写和数字。

我做错了什么?


1
永远不要限制用户输入的密码的最大长度,绝对不要。1. 没有任何好的理由。2. 这非常强烈地暗示您正在将它们存储为纯文本,这也是您永远不应该做的事情。 - Sammitch
非常同意@Sammitch的观点;密码验证应该唯一限制的是长度是否足够。我不想在我的密码中使用数字、字母、手语和声音效果,我也永远不应该这样做。 - Dan Lugg
2个回答

7

您忘记使用定界符了。请改用以下代码:

return preg_match("/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,20}$/", $password);

或者您可以分别处理每个条件并使用以下代码:

return mb_strlen($password)>=6 && mb_strlen($password)<=20
       && preg_match("/[a-z]+/", $password) && preg_match("/[A-Z]+/", $password)
       && preg_match("/[0-9]+/", $password);

6
我会把这个分成多个检查。这样可以智能化地向用户(或日志)提供有关密码选择失败原因的反馈。
<?php
function is_password($password){
    if (strlen($password) < 6) {
        // too short
        return false;
    }
    if (strlen($password) > 20) {
        // too long
        return false;
    }
    if (!preg_match("/[A-Z]/", $password) {
        // no upper
        return false;
    }
    if (!preg_match("/[a-z]/", $password) {
        // no lower
        return false;
    }
    if (!preg_match("/[0-9]/", $password) {
        // no digit
        return false;
    }
    return true;
}
?>

这种方法还可以让您在将来需要时轻松添加或删除限制。 - Andy Lester

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接