只允许字符串中的字母和数字,但没有混淆

时间:2014-10-04 17:35:29

标签: regex string unicode homoglyph

假设我希望用户名只包含字母和数字,无论语言如何。

我想我可以通过以下正则表达式部分完成此任务

(?>\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是否在我们可以过滤的某些范围内或类似的东西?

2 个答案:

答案 0 :(得分:0)

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

Cyrillic :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}]

答案 1 :(得分:0)

Unicode标准包含http://www.unicode.org/Public/security/revision-02/confusables.txt

中可混淆字符的列表

根据某些人的说法,此列表不完整,而且根据其他人的说法过于激进,但请仔细阅读,以便了解问题的解决难度。