Регистр символа в Python зависит от версии Unicode интерпретатора. Сейчас
unicodedata.unidata_version — 17.0.0, а протокол подготовки строк stringprep, который лежит в основе международных доменных имён, зафиксирован на Unicode 3.2.Поэтому
str.lower() и str.encode('idna') в разных версиях Python могут считать разные строки одинаковыми. В обычном коде это проходит незамеченным, а в проверке доменов или авторизации получается обход валидации.В контексте безопасности не зовите
str.lower() напрямую. Берите пакет idna: он реализует стандарт IDNA 2008 и не использует встроенные таблицы Unicode.Seth Larson разбирает уязвимость и показывает, как это выглядит на практике.
