Regex正在接受P @ ssW0rd作为密码

时间:2014-07-15 14:24:00

标签: regex

注意:似乎我必须坚持正常表达式的一个衬垫,由于我正在使用的验证库(jquery validation engine

我有以下正则表达式:

((?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?!^1{1,5}[a-z]+$).{8,25})$

符合以下条件:

Minimun of 8 characters
1 lowercase character
1 uppercase character
1 digit
1 special character

这里的问题是它接受: P @ ssW0rd Qw3rty * 作为有效密码。

上述内容不应通过验证。我想出了这两个表达方式,试图解决这个问题,但没有成功地将它整合到最后一块中。

p[a@][s5]{2}w[o0]rd  // anything with password in it including leet variants
qw[e3]rty            // anything with qwerty in it including leet variant

规则应该是:不要在单词的开头或结尾处允许任何密码或Qwerty变体

有关如何将这些放在一起并使其有效的任何想法?

3 个答案:

答案 0 :(得分:2)

您可以添加更多负面预见条款,如下所示吗?

(?!p[a@][s5]{2}w[o0]rd) // prevents variants of "password"
(?!qw[e3]rty)           // prevents variants of "qwerty"

...得到(也加入了起始锚):

^((?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?!^1{1,5}[a-z]+$)(?!p[a@][s5]{2}w[o0]rd)(?!qw[e3]rty).{8,25})$

但是,这可能并不是您想要的,但是为了确保您的大写字符,您必须以区分大小写的方式匹配,但表达式为"密码"和" qwerty"只有在以不区分大小写的方式匹配时才会起作用。您可能需要将其更改为以下内容:

^((?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?!^1{1,5}[a-z]+$)(?![pP][aA@][sS5]{2}[wW][oO0][rR][dD])(?![qQ][wW][e3][rR][tT][yY]).{8,25})$

呸!

说实话,我建议您对策略进行更根本的反思。

  • 你可以尝试黑名单"显而易见的"密码 - 但你永远不会抓住所有密码。怎么样" @ 5dfgHjkl"?无论你试图禁止什么,用户都可以设计一些“显而易见”的东西。但允许。
  • 对于您禁止的每一项额外事项,您都需要提出一条错误消息,向您的客户解释他们选择密码时出了什么问题。他们并不喜欢尝试猜测你的验证功能。
  • 尽管您试图强制实施密码强度,但它可能无法帮助解决常见的词典攻击,这种攻击将一个带有数字后缀的leet-speak词组合在一起。

如果您想尝试鼓励更强的密码,为什么不包括当前密码强度的直观显示,以便您的客户可以看到他们的密码有什么问题?你甚至不必编写代码:网上有很多插件。

答案 1 :(得分:0)

您可以创建一个黑名单'在正则表达式中使用以下格式:

blacklisted_exp_1|blacklisted_exp_2| ... (original_expression)

当任何列入黑名单的表达式匹配时,整个表达式将匹配,但如果所有列入黑名单的表达式都不匹配,则原始表达式捕获组将匹配。

在你的情况下,这将是:

qw[e3]rty|P[a@][s5]{2}W[o0]rd|((?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?!^1{1,5}[a-z]+$).{8,25})$

这是一个更简单的示例,您可以在Web控制台中尝试:

var regex = /foo|bar|([a-z]{3})/; // Matches all 3-letter words except foo and bar

"foo".match(regex); // ["foo", undefined]
"bar".match(regex); // ["bar", undefined]
"baz".match(regex); // ["baz", "baz"]

答案 2 :(得分:0)

您可以在正则表达式中添加否定前瞻:

^((?=.*?\d)(?=.*?[a-z])(?=.*?[A-Z])(?!p[a@][s5]{2}w[o0]rd$)(?!qw[e3]rty).{8,25})$

Regex Demo