2014-10-04 2 views
1

Скажем, я хочу, чтобы имена пользователей состояли только из букв и цифр независимо от языка.Разрешать только буквы и цифры в строках, но без путаницы

Я думаю, что я мог бы сделать это с помощью следующих регулярных выражений частей

(?>\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 путаницы в определенных диапазонах, которые мы могли бы фильтровать или что-то в этом роде?

+2

Для этой функции существуют библиотеки; они собирают гомографы в больших таблицах и компилируют их в одно регулярное выражение. – Bergi

+0

Интересно, мне кажется, я должен их искать. – user764754

ответ

0

Confusables ... Тогда приходит в голову, что вы говорите о кириллицы. Если это так, вы можете легко исключить их из своего RegEx. Рассмотрим следующие диапазоны:

кириллицы: U + 0400-U + 04FF, 256 символов

кириллицы Дополнение: U + 0500-U + 052F, 48 символов

кириллицы Расширенная-А: U + 2DE0-U + 2DFF, 32 символов

кириллицы расширенной-Б: 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

Являются ли кириллические символы единственными, которые сбиты с толку и внутри категории букв? Боюсь, что могут быть более пустые письма, чем кириллические письма. – user764754

+0

@ user764754 Да, кириллические символы являются наиболее распространенными персонажами, используемыми при атаках гомографа. Однако таким образом я исключил всех персонажей из этого прекрасного набора, но поскольку wikipedia утверждает, что «он содержит 11 строчных глифов, которые идентичны или почти идентичны латинским аналогам» – revo

+1

_ «имена пользователей состоят только из букв и цифр независимо от языка» _ если я это хорошо понимаю, пользователи должны иметь возможность регистрироваться с использованием собственного набора символов. Поэтому слепое отклонение некоторых кириллических символов произвольно предотвратит использование подлинными именами пользователей с использованием этого набора символов. –

0

Стандарт Unicode включает в себя список начертанию символов на http://www.unicode.org/Public/security/revision-02/confusables.txt

Этот список является неполным в соответствии с некоторыми и слишком агрессивным в соответствии с другими но взгляните на это, чтобы понять, как сложно решить проблему в целом.

Смежные вопросы