假设我希望用户名只包含字母和数字,无论语言如何。
我想我可以通过以下正则表达式部分完成此任务
(?>\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是否在我们可以过滤的某些范围内或类似的东西?
答案 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
中可混淆字符的列表根据某些人的说法,此列表不完整,而且根据其他人的说法过于激进,但请仔细阅读,以便了解问题的解决难度。