我在网上找到了一个脚本,它在JavaScript中有一个密码正则表达式.我仍然想使用它,但为了更安全,我想使用PHP来验证我的密码,但我对正则表达式没用.
要求:
必须至少包含8个字符
必须至少包含1个数字
必须至少包含一个大写字符
必须至少包含一个小写字符
如何构造正则表达式字符串以满足这些要求?
^\S*(?=\S{8,})(?=\S*[a-z])(?=\S*[A-Z])(?=\S*[\d])\S*$
来自Zorched的优秀人士.
^
:锚定到字符串的开头
\S*
:任何一组字符
(?=\S{8,})
:至少长度为8
(?=\S*[a-z])
:至少包含一个小写字母
(?=\S*[A-Z])
:至少一个大写字母
(?=\S*[\d])
:至少有一个号码
$
:锚定到字符串的末尾
要包含特殊字符,只需添加(?=\S*[\W])
,即非单词字符.
我发现在一个大的正则表达式中做这件事是一个代码维护的噩梦.拆分它对于查看代码的其他人来说要容易得多,它还允许您提供更具体的错误消息.
$uppercase = preg_match('@[A-Z]@', $password); $lowercase = preg_match('@[a-z]@', $password); $number = preg_match('@[0-9]@', $password); if(!$uppercase || !$lowercase || !$number || strlen($password) < 8) { // tell the user something went wrong }
一种可能的正则表达式模式是:
/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$/
如在这个例子中.
承认它.作为开发人员,我们为客户和用户的在线安全性失败做出了更多贡献,因为我们太顽固或懒得正确处理密码.看看我们劳动的一些成果:
密码长度必须介于5到32个字符之间.有效字符包括字母,数字和下划线.
密码长度必须介于6到12个字符之间.有效字符包括字母和数字.
密码必须至少包含8个字符,并且至少包含一个大写字母,数字和特殊字符(如下划线或感叹号).
然后有这个宝石.原始要求至少为8个字符.意外地输入7个字符会导致在用户之前出现错误:
密码限制错误请注意标记行.讽刺?
我可以继续这里,但我认为你明白了.我们编写了代码来支持这种废话,围绕正确的正则表达式来解决每个案例.对传输,散列和存储进行痛苦化.我们已经谈到了这一点,情况甚至已经获得了适当的流行文化地位,并在xkcd上进行了纪念.
毫无疑问,我们的意图是好的.毕竟,不能期望用户和客户正确地保护自己.他们不会创建强密码,他们经常使用"密码"这个词作为密码.他们没有留意那些遭受过身份盗窃的朋友所发出的警告,新闻报道或恐怖事件.大型零售连锁店的黑客攻击很少.作为开发人员,我们着手帮助用户避免这些陷阱.我将保证我们的尝试不足,甚至可能导致问题.
我们很可能使情况变得更糟.
通过对密码设置晦涩的限制,我们实际上迫使我们的用户陷入了一种糟糕的思维方式,因此使他们寻求阻力最小,简单,可破解密码的途径.我们这样做是因为我们习惯了对我们的限制.系统管理员将我们限制在8个字符,因此我们将限制投射到世界其他地方.现在是我们停下来学习如何处理包含任何字符的任何密码长度的时候了.我们可能希望从密码中排除空格,但除此之外我们不应对密码设置任何限制.
然后我们可以鼓励良好的安全措施,如密码短语或随机单词.一旦他们发现这一点,用户将会非常高兴他们不必记住像f @ rtp00p这样的字母和数字的愚蠢组合.
我可以看到你翻白眼.这意味着您必须学习如何正确地散列密码以及如何将输入的密码与散列进行比较.你将不得不折腾一些真正的硬盘正则表达式.天堂禁止你可能需要重构一些代码!数据库可以容纳非常大的散列密码,我们应该利用该功能.
请记住,数据的一般安全性是关于我,开发人员以及系统管理员和其他人.用户帐户的安全性在他们身上,我不应该做任何事情来阻止他们.就个人而言,我并不关心用户的密码.当用户创建密码时,我所做的就是提供强度计和一些基本指南:
"我们发现使用密码短语或多个单词组合是最安全的,可以防止黑客试图破解您的登录信息,从而获得成功."
你该怎么办?
PHP的内置函数完美地处理密码安全性,空格,特殊字符等等.如果您使用的PHP版本低于5.5,则可以使用password_hash()
兼容包.
我们需要消除对密码的限制,并释放用户在线拥有自己的安全性.你在吗?