Разрешить только буквы и цифры в строках, но без путаницы

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

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

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

\p{Nd} //match any digit

Теперь у меня есть проблема, что пользователи могут притворяться другими пользователями, используя имя пользователя, которое выглядит так же, как имя другого пользователя (атака омографа). admin vs aadmin может быть примером.

Я предполагаю, что невозможно легко исключить символы, которые являются одновременно буквами и путаницами, используя регулярное выражение, но как насчет вне контекста регулярных выражений. Находятся ли Unicode-идентификаторы запутанных объектов в определенных диапазонах, которые мы могли бы фильтровать, или что-то в этом роде?


person user764754    schedule 04.10.2014    source источник
comment
Для этой функциональности существуют библиотеки; они собирают омографы в большие таблицы и компилируют их в одно регулярное выражение.   -  person Bergi    schedule 04.10.2014
comment
Интересно, я думаю, что я должен искать их тогда.   -  person user764754    schedule 04.10.2014


Ответы (2)


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

Кириллица: U+0400–U+04FF, 256 символов.

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

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

Расширенная кириллица-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}]

person revo    schedule 04.10.2014
comment
Являются ли кириллические символы единственными, которые можно спутать и которые входят в буквенную категорию? Я боюсь, что может быть больше запутанных букв, чем буквы кириллицы. - person user764754; 04.10.2014
comment
@user764754 user764754 Да, символы кириллицы являются наиболее распространенными символами, используемыми в атаках с использованием омографов. Однако таким образом я исключил всех персонажей из этого прекрасного набора, но, как утверждает википедия it contains 11 lowercase glyphs that are identical or nearly identical to Latin counterparts - person revo; 04.10.2014
comment
имена пользователей должны состоять только из букв и цифр независимо от языка, если я хорошо это понимаю, пользователи должны иметь возможность регистрироваться, используя свой родной набор символов. Таким образом, слепое отклонение некоторых символов кириллицы произвольно предотвратит использование подлинных имен пользователей с этим набором символов. - person Sylvain Leroux; 04.10.2014
comment
@revo это, безусловно, полезно, но тот факт, что кириллические символы используются чаще всего, не совсем делает его безопасным, когда злоумышленник может использовать другие символы. У Сильвена Леру: Да, но я думаю, что допущение путаницы при определенных условиях приведет к большой сложности. - person user764754; 04.10.2014
comment
@user764754 user764754 Сама тема спорна, но непрактична из-за огромного и большого сравнения языков. Для себя, на вашем месте, я бы сделал язык базовым (может быть, английский?!) и попытался собрать омографические символы в его буквы. Таким образом, я уверен, что у людей может быть много имен пользователей, даже одинаковых, но это не имеет значения, потому что все, что я знаю, это мой базовый язык, который я сделал безопасным. - person revo; 04.10.2014
comment
Это кажется необычным наказанием для всех, кто хочет использовать кириллицу (иногда в том числе и для меня!). Самое простое решение — разрешить только латинские имена — никакой путаницы, никакой дискриминации. - person mvp; 05.10.2014

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

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

person Joe Hildebrand    schedule 07.10.2014