结合正则表达式进行密码检查

时间:2018-11-15 10:26:06

标签: regex laravel passwords

在Laravel中,我必须对密码进行严格的安全检查。 我对Regex并不了解,但是我认为这是最好的解决方案,我相信它可以满足我的需求。所以这是我客户的规则:

密码必须包含所有4个字符的类型:

  • 小写:a-z
  • 大写:A-Z
  • 数字:0-9
  • 特殊字符:! “#$%&'()* +,-。/:; <=>?@ [\] ^ _ _ {{}〜
  • 您的用户名,名字或姓氏不应包含在密码中。
  • 永远不要使用相同字符的连续集(aaaaaa ...,1111111 ...)

搜索Stackoverflow时,我发现了一个类似的解决方案,该解决方案处理前4条规则,但进行了必要的修改:

/^.*(?=.*[a-zA-Z])(?=.*[0-9])(?=.*[!"#$%&'()*+,-.\/:;<=>?@[\]^_`{|}~]).*$/

此外,我找到了最后一条规则的解决方案(连续字符集-在这种情况下为6个字符),应该对此进行一些修改,因为我实际上不希望密码具有重复的字符集字符。它搜索重复集:

/(.)\1{5,}/

关于“名称不能成为密码的一部分”规则,由于我们必须将一个字符串参数传递给它,因此甚至可以在正则表达式中进行吗?

无论如何,我想为所有规则组合使用1个正则表达式。由于这可能不可行,是否有可能对所有内容至少使用一个正则表达式进行合并,除了“不允许使用用户名”部分之外?然后,我可以对该特定规则进行自定义验证。

我不认为我的问题是重复的,因为它是至少两个问题的组合。鉴于“重复”只是我的正则表达式的一部分,我不知道该如何与其他正则表达式结合使用。

1 个答案:

答案 0 :(得分:2)

一种选择是添加一个否定的前行,它断言所输入的密码中没有任何两个连续字符出现:

/^(?!.*(.)\1)(?=.*[a-zA-Z])(?=.*[0-9])(?=.*[!"#$%&'()*+,-.\/:;<=>?@[\]^_`{|}~]).*$/
   ^^^^^^^

请注意,您在模式开始时使用的.*可能放错了位置。您不需要/不需要在那里,因为您希望在开始匹配实际密码之前先行触发。

Demo