为密码验证创建 preg_match 允许 (!@#$%)

Posted

技术标签:

【中文标题】为密码验证创建 preg_match 允许 (!@#$%)【英文标题】:Create preg_match for password validation allowing (!@#$%) 【发布时间】: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 等)。 【参考方案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密码”的密码..因为我输入了不同的密码组合但它无法提交..

以上是关于为密码验证创建 preg_match 允许 (!@#$%)的主要内容,如果未能解决你的问题,请参考以下文章

php表单 - 验证邮件和URL

Yii2密码验证正则表达式

名称验证表单不允许名称之间有空格[重复]

php regex preg_match 只允许某些关键字

PHP preg_match 用于验证 10 位手机号码

PHP数据验证