我一直在使用此正则表达式来验证是否满足特定密码要求:
$scope.userObj.user_password.match(/^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#\$%\^&\*])(?=.{8,})/)
它工作正常……但是我遇到的不是一个人,而是同一天试图设置密码中带有句点(。)的两个用户。我从没想到用户会那样做...关于用户的有趣的事情是,他们总会找到做您从未想到的事情的方法。无论如何,我还认为句点被定义为普通字符,而不是特殊字符...所以,如果使用句点,为什么上面的代码不能作为一个好的密码?
第二,显然上述方法不起作用,因此要使其正常工作,我需要将特殊符号部分修改为(我认为)以下内容:
(?=.*[!@#\$%\^&\*\.\,\(\)\-\+\=])
在我的数据库中,我使用PHP SHA512加密密码,然后将其保存到标准mysql schar(128)列中。
A:这足以使我的正则表达式正确包含句号吗?的 使用句点也让我想知道是否需要包括其他 标准键盘符号,如(,)-+ =等(也包含在新的正则表达式中)。
B:然后,您向兔子洞走了多远-是〜和`和 [,],{,},\,|还应该考虑的字符?有没有 无需列出它们的更好的方式来定义它们 单独吗?
C:考虑如何存储密码并允许所有这些额外的 特殊字符...是否存在任何特定问题或安全性 我需要意识到的问题...或应避免的事情?
答案 0 :(得分:1)
答对A::如果您测试了第一个正则表达式(https://www.phpliveregex.com/),您会发现它已经接受了句点,因为在每次积极的前瞻之后都包含.*
{ {1}}。
您的正则表达式可以有效地确保您的输入至少包含一个小写字母,一个大写字母,一个特殊字符以及至少八个字符,但是它还接受其他所有内容。
换句话说,您的正则表达式是一个很好的“白名单”,但是您没有“黑名单”。您应该考虑进行另一项测试以仅接受所需的字符
赞:(?=)
B的答案:关于您将在密码中接受哪些字符...没有规则。您是管理员,可以接受您想要的任何内容,因为在解析和嵌入之前可以正确清理/转义输入内容。
如果您有很多特殊字符,则需要大量的正则表达式。但是您不需要一个大列表,它可以很简单! 。 #$ ^
对C的答案:当您执行SQL命令或PHP回显,使用用户输入进行打印而不进行清理/适当的转义时,会发生用户输入的安全问题。
这是关于https://stackoverflow.com/a/130323/10677269主题的一个很好的答案
最后,您应该考虑上面的评论。 SHA512不是加密算法(它是一种摘要算法),除非将其“加盐”(否则,加密是一个更好的选择),否则不应用于在数据库中存储密码。