0

我将其用于需要 8-20 个字符长的密码,只有数字、字母和 !@#$% 符号:

if (!preg_match('/^(?=.*\d)(?=.*[A-Za-z])[0-9A-Za-z!@#$%]{8, 20}$/', $_POST['password'])) {
    $errors[] = true;
    $_SESSION['error'] .= '<div class="messages status_red">Password must be 8-20 long, A-Z, 0-9, !@#$% only.</div>';   
}

但是,无论我是否符合标准,我仍然会返回错误。

我也没有看到任何 error_reporting 消息。

知道这可能是什么原因吗?

4

2 回答 2

5

问题是 中的空间{8, 20},这使它无法被识别为{最小,最大}量词。但我不知道你为什么要用积极的前瞻性等使事情复杂化;像这样简单的事情应该可以解决问题:

preg_match('/^[A-Za-z0-9!@#$%]{8,20}$/',  $_POST['password'])

编辑添加:在密码中允许任何字符是更好的安全做法。如果他们可以键入它,就让他们使用它——您是否能够在不违反 SQL 注入或类似情况的情况下处理它。(无论如何,您不会将密码存储在数据库中,对吗?对。)

如果您想要求一定数量的字符多样性以鼓励使用更强的密码——例如,至少需要一个字母、数字,并且两者都不要求——那么你可以这样做。在这里,使用前瞻意味着密码中的字母、数字和以上都不是:

preg_match('/(?=.*[A-Za-z])(?=.*[0-9])(?=.*[^a-zA-Z0-9])/', $_POST['password'])

您也可以尝试将长度要求纳入正则表达式,但我只会单独检查长度 - 在这里,我将有一个最小值,但没有最大值。(由于永远不应该存储密码,而只存储校验和,较长的密码不应该产生任何额外的存储开销。但是如果您确实遇到由于某种原因需要限制长度的情况,请尝试在数百个中选择一个限制-of-characters 范围而不是数十个字符范围。)

于 2013-05-13T23:34:44.470 回答
3

不要在{8, 20}. 它应该只是{8,20}

于 2013-05-13T23:34:14.457 回答