Существует риск, если некоторые части вашей программы предполагают, что строки с разными байтами отличаются, но другие части программы сравнивают строки в соответствии с семантикой юникода и думают, что они одинаковы.
Например, файловые системы в Mac OS X обеспечивают единообразное представление символов Unicode, поэтому два разных имени файла Ą
('A with ogonek') и A
+ ̨
(латинский A, за которым следует 'объединения ogonek') обратитесь к тому же файлу.
Точно так же можно получить недопустимых последовательностей байтов UTF-8, где 1-байтовые кодовые точки кодируются с использованием нескольких байтов (так называемые слишком длинные последовательности). Если вы нормализуете или отклоняете ввод UTF-8 перед обработкой, это будет безопасно, но, например, если вы используете Unicode-невежественный язык программирования и Unicode-based базу данных, эти два будут видеть разные входные данные.
Итак, чтобы избежать этого:
Вы должны отфильтровать ввод UTF-8 как можно раньше. Отклонить недействительные / слишком длинные последовательности.
При сравнении строк Юникода всегда конвертируйте обе стороны сравнения в одну и ту же нормальную форму Юникода. Для имен пользователей вы можете захотеть, чтобы NFKD уменьшил количество возможных атак с помощью гомографа.