正则表达式与Angular 2中的加号(' +')不匹配,但它在测试人员中工作正常

时间:2017-06-14 22:19:43

标签: javascript regex angular

以下是代码:

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

此变量在其他地方使用如下:

Validators.pattern(PASSWORD_PATTERN);

此代码旨在通过确保密码包含一个小写字母,一个大写字母和一个数字来验证密码。密码可以包含任意数量的特殊字符,这些字符是可以在标准键盘上找到的字符(例如〜*(}; +)。截至目前,正则表达式将匹配包含每个特殊字符的密码,除了加号(&#39; +&#39;)。我已尝试用&#39; \ +&#39;和&#39; \\ +替换&#39; +&#39; &#39;在正则表达式中,但是没有改变结果。在某一点上,我摆脱了正则表达式中除加号外的每个特殊字符,自行测试,再次使用&正则表达式中的#39; +&#39;,&#39; \ +&#39;和&#39; \\ +&#39;不会为包含加号的密码生成任何匹配项。

使用我之前粘贴的正则表达式,此密码被视为匹配:

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

虽然此密码不被视为匹配:

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

这两个密码之间的唯一区别是最后的单个加号,而第二个密码不匹配正则表达式是否包含+,\ +或\\ +。

正则表达式完全在后端工作,尽管它已针对主要在后端使用的语言进行了修改。

3 个答案:

答案 0 :(得分:0)

不是最漂亮的东西,但这似乎有效(或至少朝着正确的方向发展):

&#13;
&#13;
let characters = /((.*[A-Z])((.*[a-z].*\d)|(.*\d.*[a-z])).*)|((.*[a-z])((.*[A-Z].*\d)|(.*\d.*[A-Z])).*)|((.*\d)((.*[a-z].*[A-Z])|(.*[A-Z].*[a-z])).*)/;
let length = /.{8,}/;

let good1 = 'abc+Def8';
let good2 = '8b2cDde+';
let bad1 = 'abc+def8';
let bad2 = 'Ab+cde';
let bad3 = 'ab+cD2'

console.log(characters.test(good1) && length.test(good1), characters.test(good2) && length.test(good2), characters.test(bad1) && length.test(bad1), characters.test(bad2) && length.test(bad2), characters.test(bad3) && length.test(bad3));
&#13;
&#13;
&#13;

答案 1 :(得分:0)

使用this site对其进行测试,底部的JS代码看起来好像正常。您如何测试以确保密码有效?

在新的regEx中,我将所有符号都更改为[\S]。这将匹配所有不是空格的字符。您是否要将密码限制为通常在键盘上使用的特殊字符或所有可能的字符?如果是这样,您应该使用[\S]。事实上,没有任何理由不允许您在密码中允许所有字符(除了结束行)。在这种情况下,您应该将[\S]替换为.

您如何处理密码值?你是用纯文本把它传递到后端吗?一个很好的方法来处理它可能是检查密码是否与前端的正则表达式匹配,使用sha-256散列密码(如果你想要好看并且过度杀戮,则用一个唯一的用户字符串加密),然后把它传回服务器。然后,服务器将再次对密码进行加密和哈希处理,然后将其存储在一个表中,以便与用户下次登录时进行比较。

这有助于为用户添加额外的安全层。假设您正在使用用户和服务器之间的ssl连接,这并不是真正需要的(总是使用SSL),但是当涉及到用户密码时,更安全的一点总是很好。这就是说,如果他们在中间攻击中获得成功的人,这将不会阻止某人以用户身份登录,因为当对密码用户端进行散列时,它只会成为发送到服务器并经过验证的验证。但是,这可以避免您了解用户的实际密码,因此如果有人拦截了哈希(或者说服务器泄漏了一些服务器端的哈希数据。看着你的心脏!)有人不能轻易搞定一堆其他网站,并尝试用户的用户名/密码组合。

const regEx = /^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])[\S]{8,}$/;

const good1 = 'A12345678a+'
const good2 = 'Aaascfsfas1@#$@+#$%'
const example1 = 'Password1`~!@#$%^&*()-_=[{]}\|;:",<.>/?'
const example2 = 'Password1`~!@#$%^&*()-_=[{]}\|;:",<.>/?+'
const bad1 = 'a'
const bad2 = 'aasdfasfdsfads@+#$%$#@'

console.log(
regEx.test(good1), regEx.test(good2), 
regEx.test(example1), regEx.test(example2), 
regEx.test(bad1), regEx.test(bad2)
)

答案 2 :(得分:0)

事实证明,当我将密码附加到参数时,我需要将它包装在encodeURIcomponent()方法中。不确定原因,但现在我创建的所有正则表达式模式现在都按预期工作。