为密码验证创建 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 < ascii_code < 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 允许 (!@#$%)的主要内容,如果未能解决你的问题,请参考以下文章