用于密码表达的正则表达式方法

时间:2019-01-24 21:43:04

标签: javascript mysql regex passwords

我一直在使用此正则表达式来验证是否满足特定密码要求:

$scope.userObj.user_password.match(/^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#\$%\^&\*])(?=.{8,})/)

它工作正常……但是我遇到的不是一个人,而是同一天试图设置密码中带有句点(。)的两个用户。我从没想到用户会那样做...关于用户的有趣的事情是,他们总会找到做您从未想到的事情的方法。无论如何,我还认为句点被定义为普通字符,而不是特殊字符...所以,如果使用句点,为什么上面的代码不能作为一个好的密码?

第二,显然上述方法不起作用,因此要使其正常工作,我需要将特殊符号部分修改为(我认为)以下内容: (?=.*[!@#\$%\^&\*\.\,\(\)\-\+\=])

在我的数据库中,我使用PHP SHA512加密密码,然后将其保存到标准mysql schar(128)列中。

  

A:这足以使我的正则表达式正确包含句号吗?的   使用句点也让我想知道是否需要包括其他   标准键盘符号,如(,)-+ =等(也包含在新的正则表达式中)。

     

B:然后,您向兔子洞走了多远-是〜和`和   [,],{,},\,|还应该考虑的字符?有没有   无需列出它们的更好的方式来定义它们   单独吗?

     

C:考虑如何存储密码并允许所有这些额外的   特殊字符...是否存在任何特定问题或安全性   我需要意识到的问题...或应避免的事情?

1 个答案:

答案 0 :(得分:1)

答对A::如果您测试了第一个正则表达式(https://www.phpliveregex.com/),您会发现它已经接受了句点,因为在每次积极的前瞻之后都包含.* { {1}}。

您的正则表达式可以有效地确保您的输入至少包含一个小写字母,一个大写字母,一个特殊字符以及至少八个字符,但是它还接受其他所有内容。

换句话说,您的正则表达式是一个很好的“白名单”,但是您没有“黑名单”。您应该考虑进行另一项测试以仅接受所需的字符

赞:(?=)

B的答案:关于您将在密码中接受哪些字符...没有规则。您是管理员,可以接受您想要的任何内容,因为在解析和嵌入之前可以正确清理/转义输入内容。

如果您有很多特殊字符,则需要大量的正则表达式。但是您不需要一个大列表,它可以很简单! 。 #$ ^

对C的答案:当您执行SQL命令或PHP回显,使用用户输入进行打印而不进行清理/适当的转义时,会发生用户输入的安全问题。

这是关于https://stackoverflow.com/a/130323/10677269主题的一个很好的答案

最后,您应该考虑上面的评论。 SHA512不是加密算法(它是一种摘要算法),除非将其“加盐”(否则,加密是一个更好的选择),否则不应用于在数据库中存储密码。