Готовые библиотеки Java, Python и JavaScript для валидации IDN-доменов и EAI

Популярность кириллического домена .РФ растет. В 2023 году .РФ вырос на 92 769 доменных имен (+13,7%). На март 2024 года в .РФ зарегистрировано более 777 тысяч доменных имен, ежемесячно пользователи регистрируют около 15 тысяч новых кириллических доменов. Но реализация в программном обеспечении правильной поддержки IDN и EAI не всегда является очевидной задачей для разработчиков. «Официальным» языком интернета по-прежнему считается английский, а работа большинства приложений, устройств и систем со средствами интернет-адресации по умолчанию реализуется с использованием символов латинского алфавита и кодировки ASCII.

Чтобы ПО, например приложение или сайт, корректно поддерживало доменные имена и адреса электронной почты на русском или китайском языке (с символами Unicode), его разработчику потребуется самостоятельно реализовать эту функциональность в своем коде. Другой вариант — использовать готовую библиотеку или программный модуль.

Чтобы упростить задачу, мы подготовили обзор некоторых известных библиотек на самых распространенных языках программирования: Java, Python и JavaScript. Они помогут обеспечить поддержку интернационализированных доменов и email-адресов в вашем ПО в соответствии со стандартами IDNA2008 и EAI.

Кроме того, предлагаем инструкции с пояснениями и примерами фрагментов кода для их правильного использования.

Библиотеки для Java

Работают с Java 11 на фреймворкe SparkJava. Исходный код написан в Gradle.

Библиотеки с поддержкой стандарта IDNA

guava. Библиотека выполняет только некоторые базовые проверки доменного имени — например, длину метки доменного имени, отсутствие дефиса в конце. А также позволяет проверить наличие доменного имени в перечне проекта Public Suffix List. Поэтому для корректной валидации IDN использовать эту библиотеку рекомендуется, только чтобы проверить наличие доменного имени в перечне Public Suffix List совместно с другими валидирующими библиотеками для остальных проверок.

commons-validator. Библиотека осуществляет валидацию доменных имен, адресов электронной почты и URL. Она использует статический список доменов верхнего уровня, который содержится в исходном коде, поэтому в зависимости от версии библиотеки список доменов может быть сильно устаревшим. Поскольку список доменов верхнего уровня постоянно обновляется, любой статический список быстро устаревает. Чтобы избежать ошибок, связанных с этой проблемой, необходимо загружать список доменов верхнего уровня с официального сайта IANA, а затем обновлять статический список в библиотеке. При использовании библиотеки в фоновом режиме список останется устаревшим до следующего такого обновления, поскольку список доменов не может быть обновлен после начала работы валидатора.

icu. Библиотека может использоваться для конвертирования меток U-Label в A-Label, и наоборот. icu получает U-Label как входящий параметр и возвращает либо A-Label, либо ошибку, если домен недействителен. Для полного соответствия стандарту IDNA2008 библиотеку необходимо дополнить набором специальных флагов.

Библиотеки с поддержкой стандарта EAI

commons-validator. В случае валидации адреса электронной почты сохраняется проблема с доменной частью адреса, описанная выше.

jakarta-mail. Библиотека предназначена для отправки электронных писем на адреса электронной почты, которые являются входными параметрами библиотеки. jakarta-mail валидирует EAI-адреса электронной почты, однако доменную часть адреса необходимо предварительно нормализовать по форме NFC. Кроме того, некоторые соответствующие стандарту IDNA2008 символы могут не пройти валидацию. Библиотеку возможно использовать для работы с EAI-адресами, предварительно проведя нормализацию доменной части или преобразовав доменную часть в A-Label c помощью библиотеки icu с учетом особенностей этой библиотеки, описанных выше. Кроме того, jakarta-mail не возвращает ошибку, если почтовый сервер не поддерживает расширение SMTPUTF8, поэтому такую проверку необходимо осуществлять дополнительно.

Библиотеки для JavaScript

Работают с версией NodeJS  17.5 и выше.

Библиотеки с поддержкой стандарта IDNA

idna-uts46 (idna_convert.js). Библиотека выполняет преобразование доменных имен из U-метки в A-метку и обратно. Она не поддерживает преобразование URL. Версия стандарта IDNA2003 или IDNA2008 задается через параметр при вызове библиотеки.

Библиотеки с поддержкой стандарта EAI

validator.js (eai-validate.js). Библиотека предоставляет API (программный интерфейс) к функции isEmail, которая поддерживает работу с EAI-адресами и используется для валидации адресов электронной почты как на стороне сервера, так и на стороне клиента.

nodemailer (eai-smtp.js). Библиотека представляет собой SMTP-клиент для отправки почтовых сообщений серверной частью JavaScript. Она автоматически преобразует доменную часть адреса из U-метки в A-метку с помощью punycode.js. И хотя она осуществляет проверку расширения SMTPUTF8, отправка письма с адреса, содержащего в локальной части отличные от ASCII символы, серверу, не поддерживающему расширение SMTPUTF8, не привела к ошибке. Таким образом, подобную проверку необходимо проводить дополнительно.

Библиотеки для Python

Работают на фреймворке Flask.

Библиотеки с поддержкой стандарта IDNA

idna. Библиотека поддерживает стандарт IDNA2008 и может быть использована для конвертирования U-метки в A-метку, и наоборот. Библиотека не выполняет нормализацию, для нормализации домена в NFC необходимо использовать стандартный модуль Python: unicodedata.normalize('NFC', domain).

Библиотеки с поддержкой стандарта EAI

email_validator. Библиотека валидирует адреса электронной почты, полученные на входе, или возвращает ошибку, если адрес не соответствует формату. Библиотека делает «общую» проверку. Это значит, что некоторые адреса, соответствующие RFC, могут не пройти валидацию. Например, если у адреса локальная часть указана в кавычках, а внутри локальной части содержится символ @.

smtplib. Библиотека используется для отправки письма на адрес электронной почты, указанный на входе, в том числе на EAI-адреса электронной почты.smtplib выполняет проверку наличия расширения SMTPUTF8. Однако проверку адреса электронной почты осуществляет лишь частично, не обеспечивая проверку на соответствие доменной части адреса протоколу IDNA2008. Для этих целей необходимо использовать библиотеку email_validator.


Узнать больше

Подробная информация о перечисленных библиотеках доступна в материалах Группы управления по универсальному принятию (UASG) и на GitHub.
Инструкции на русском языке по использованию перечисленных библиотек опубликованы в базе знаний проекта Поддерживаю.рф.

  1. Пример использования валидирующих EAI- и IDN-библиотек в коде Python
  2. Пример использования валидирующих EAI- и IDN-библиотек в коде Java
  3. Пример использования валидирующих EAI- и IDN-библиотек в коде Javascript


#ПоддерживаюРФ