On Russian

Особенности Unicode и алфавитов, которые стоит знать.

Homoglyphs

В математике есть много символов, похожих на буквы латинского алфавита. А ещё есть emoji. Зовут их letterlike symbols, и они могут создавать некоторые проблемы (об этом ниже).

Но кроме них есть так называемые Homoglyphs – похожие буквы. Или вообще одинаковые. Или не буквы. Например, вы знаете, что “с” может быть как русской буквой “эс”, так и английской “си”. И пишутся они совершенно одинаково.

Ребята из Unicode Consortium заботятся, чтобы нам было не слишком больно, и собрали полный список символов, которые могут делать больно.

Алфавиты

Однозначно определить язык по одной букве не получится. Символы Uncode разбиты на группы которые я для простоты называю категориями. Группы соответствуют алфавитам, и в одном языке используется лишь часть символов из алфавита, а один алфавит используют множество языков. Например, кириллический алфавит используется в русском, украинском, белорусском и прочих языках. Всего в Unicode 421 символ в кириллице, 1299 – в латинском алфавите, ну и ещё куча всяких алфавитов и групп символов.

Зачем это всё знать?

Такие символы позволяют делать довольно жестокие вещи:

  1. Ломать код.
  2. Регистрировать фишинговые ресурсы: пример и описание атаки.
  3. Обходить защиту от SQL инъекций

Ну и тупо человек может перепутать буквы. Например, при вводе промокода, какого-то ключика или пароля от Wi-Fi.

Python

В стандартной библиотеке Python есть unicodedata – модуль для получения информации о unicode-символе. Собственно, это все его возможности.

А ещё есть библиотека confusable_homoglyphs. не используйте её. Наверное, это худшее, что я видел написанное на Python. У меня есть немного аргументов:

  1. Оно не работает. Просто попробуйте вот это: python from confusable_homoglyphs import confusables confusables.is_confusable('Д', preferred_aliases=['latin']) Спойлер: TypeError: 'NoneType' object is not iterable 2. Автору кажется, что бинарный поиск по связанному списку – это весело. Нет, не весело. 3. Вся огромная БД выгружается в ОЗУ. В общем, много проблем. Я сделал круто: homoglyphs. Умеет работать с языками, алфавитами, гомоглифами, выгружать в память только нужные данные (а заодно так можно отфильтровать ненужные гомоглифы), конвертировать гомоглифы в ASCII. А вообще, всё началось с того, что я решил сделать самый кислотный модуль – ѕωåǵ. Если нужно срочно оформить witch-house альбом – используйте его, должно помочь. Там я символы вручную отбирал и сортировал, чтобы было максимально кислотно. ## Другие языки homoglyph – библиотека для Java и Java Script, в которой используется список гомоглифов, распарсенный с помощью скрипта на Python. Видно, автор очень любит языки программирования. Можете использовать. Как минимум, можно забрать распарсенный файлик.
created: 2018-05-16 (Wed) updated: 2019-02-21 (Thu) views: 100

Contributors

orsinium