2

假设我希望用户名仅由字母和数字组成,而与语言无关。

我想我可以用以下正则表达式部分来完成这个

(?>\p{L}[\p{Mn}\p{Mc}]*) //match any letter, including those consisting of two code points

\p{Nd} //match any digit

现在我遇到的问题是,用户可能会通过使用与另一个用户的用户名相同的用户名来伪装成其他用户(同形词攻击)。admin vs admin 就是一个例子。

我想不可能使用正则表达式轻松排除既是字母又是易混淆的字符,但是在正则表达式的上下文之外呢?易混淆的 unicode id 是否位于我们可以过滤的特定范围内或类似的范围内?

4

2 回答 2

0

混淆...然后想到你在谈论西里尔字符。如果这是正确的,您可以轻松地将它们从您的 RegEx 中排除。考虑以下范围:

西里尔文:U+0400–U+04FF,256 个字符

西里尔文补充:U+0500–U+052F,48 个字符

Cyrillic Extended-A:U+2DE0–U+2DFF,32 个字符

Cyrillic Extended-B:U+A640–U+A69F,96 个字符

音标扩展:U+1D2B、U+1D78、2个西里尔字母

然后:

/[^\x{0400}-\x{04FF}\x{0500}-\x{052F}\x{2DE0}-\x{2DFF}\x{A640}-\x{A69F}\x{1D2B}\x{1D78}]/u

或者简单地通过使用[^\p{Cyrillic}]

于 2014-10-04T17:57:49.113 回答
0

Unicode 标准在http://www.unicode.org/Public/security/revision-02/confusables.txt中包含一个易混淆字符列表

该列表在某些人看来是不完整的,而在其他人看来过于激进,但请查看它以了解一般解决问题的难度。

于 2014-10-07T00:03:44.913 回答