Обучение
Модуль
Форматирование буквенно-цифровых данных для представления в C# - Training
Изучите основные методы в C# для форматирования буквенно-цифровых данных.
Этот браузер больше не поддерживается.
Выполните обновление до Microsoft Edge, чтобы воспользоваться новейшими функциями, обновлениями для системы безопасности и технической поддержкой.
В этом разделе содержатся сведения о безопасности, связанных с функциями международной поддержки. Вы можете использовать его в качестве отправной точки, а затем просмотреть документацию по международной технологии, интересующей вопросы безопасности.
В этом разделе содержатся следующие подразделы.
MultiByteToWideChar и WideCharToMultiByte — это функции Юникода и набора символов, которые чаще всего используются для преобразования символов между ANSI и Юникодом. Эти функции могут вызывать риски безопасности, так как они по-разному подсчитывают элементы входных и выходных буферов. Например, MultiByteToWideChar принимает входной буфер, подсчитываемый в байтах, и помещает преобразованные символы в буфер размером в символы Юникода. Когда приложение использует эту функцию, оно должно правильно изменить размер буферов, чтобы избежать переполнения буфера.
По умолчанию Для WideCharToMultiByte используется сопоставление "наилучшим образом" для кодовых страниц, например 1252. Однако этот тип сопоставления позволяет использовать несколько представлений одной и той же строки, потенциально делая приложение уязвимым для атак. Например, латинская прописная буква A с dieresis ("Ä") может сопоставляться с латинской прописной буквой A ("A"); Символ Юникода на азиатском языке может сопоставляться с косой чертой ("/"). С точки зрения безопасности предпочтительнее использовать флаг WC_NO_BEST_FIT_CHARS.
Некоторые кодовые страницы, например кодовые страницы 5022x (iso-2022-x), по своей сути небезопасны, так как они допускают несколько представлений одной строки. Правильно написанный код выполняет проверки безопасности в форме Юникода, но эти типы кодовых страниц расширяют уязвимость ваших приложений к атакам, и их следует избегать, если это возможно.
Сравнение строк может привести к проблемам безопасности. Так как все функции сравнения немного отличаются, одна функция может сообщать о двух строках как равные, а другая функция может считать их различными. Ниже приведено несколько функций, которые приложения могут использовать для сравнения строк.
Как и lstrcmpi и lstrcmp, CompareString вычисляет строки по символам. Однако многие языки имеют многосимвийные элементы, например элемент "CH" из двух символов в традиционном испанском языке. Так как CompareString использует языковой стандарт, предоставленный приложением, для идентификации многосимвые элементы, а lstrcmpi и lstrcmp используют языковой стандарт потока, идентичные строки могут не сравниваться как равные.
CompareString игнорирует неопределенные символы и, таким образом, возвращает ноль (указывающее на равные строки) для многих пар строк, которые являются совершенно разными. Строка может содержать значения, которые не соответствуют ни одному символу, или символы с семантикой за пределами домена приложения, например управляющие символы в URL-адресе. Приложения, использующие эту функцию, должны предоставлять обработчики ошибок и тестовые строки, чтобы убедиться в их допустимости перед их использованием.
Примечание
Для Windows Vista и более поздних версий Функция CompareStringEx аналогична Функции CompareString. Проблемы безопасности для этих функций идентичны.
Аналогичные проблемы безопасности применяются к функциям, таким как FindNLSString, которые выполняют неявные сравнения. В зависимости от установленных флагов результаты вызова FindNLSString для поиска одной строки в другой строке могут значительно отличаться.
Примечание
Для Windows Vista и более поздних версий Функция FindNLSStringEx похожа на FindNLSString. Проблемы безопасности для этих функций идентичны.
Кодовая страница Windows и наборы символов OEM, используемые в системах на японском языке, содержат символ иены (евро) вместо обратной косой черты (\). Таким образом, символ иены является запрещенным символом для файловых систем NTFS и FAT. При сопоставлении Юникода с кодовой страницей на японском языке функции преобразования сопоставляют обратную косую черту (U+005C) и обычный символ Юникода йены (U+00A5) с этим же символом. По соображениям безопасности приложения обычно не должны разрешать символ U+00A5 в строке Юникода, который может быть преобразован для использования в качестве имени файла FAT.
Международные доменные имена (IDN) задаются в рабочей группе по сети RFC 3490: internationalizing domain names in Applications (IDNA). В стандарте возникает ряд проблем безопасности.
Глифы, представляющие определенные символы из разных скриптов, могут выглядеть похожими или даже идентичными. Например, во многих шрифтах кириллица в нижнем регистре A ("a") неотличима от латинского нижнего регистра A ("a"). Нет никакого способа визуально определить, что "example.com" и "example.com" являются двумя разными доменными именами: одно с латинским строчным регистром A в имени, а другое с кириллицей в нижнем регистре A. Недобросовестный хост-сайт может использовать эту визуальную неоднозначность, чтобы притвориться другим сайтом в атаке спуфинга.
Расширенный набор символов, допускающий IDNA для IDN, также имеет потенциал спуфингов в рамках определенного скрипта. Например, существует сильное сходство дефис-минус ("-" U+002D), дефис ("—" U+2010), неразрывный дефис ("-" U+2011), тире фигуры ("\u2012" U+2012), тире ("–" U+2013) и знак минуса ("-" U+2212).
Аналогичные проблемы возникают из-за определенных композиций совместимости. Например, один символ Юникода NUMBER TWENTY FULL STOP ("20.", U+249B) преобразуется в "20". (U+0032 U+0030 U+002E) на шаге NamePrep перед преобразованием в Punycode. Другими словами, в эту композицию вставляется точка (полная остановка). Такие композиции имеют потенциал спуфингом.
Смешение различных скриптов в idN не обязательно указывает на спуфингой или обманчивое намерение. Технический отчет No 36. Вопросы безопасности в Юникоде содержит несколько примеров разумных удостоверений IDN, содержащих сочетание сценариев, таких как XML-Документы.com ("Документы" — русский язык).
Атаки спуфингом не ограничиваются идентификаторами idn. Например, "rnicrosoft.com" во многом похож на "microsoft.com", но это имя ASCII. Кроме того, атака спуфингом может быть совершена путем повреждения имени. Добавление дополнительных меток после известной торговой марки или включение названия торговой марки в путь URL-адреса, помеченного как безопасный, может запутать начинающих пользователей, независимо от использования IDN. Для некоторых языковых стандартов требуются idN, и форма punycode этих имен неприемлема, так как она делает имена похожими на тарабарские.
Дополнительные сведения о упомянутых здесь проблемах безопасности, а также о большом количестве других проблем, относящихся к IDNA, см. в разделе Технический отчет No 36. Вопросы безопасности в Юникоде. Наряду с подробным обсуждением проблем безопасности, связанных с IDNA, в этом отчете содержатся рекомендации по работе с подозрительными идентификаторами IDN в приложениях.
Примечание
Рекомендуется использовать Юникод в глобальных приложениях, особенно в новых, если это возможно. Функции ANSI следует использовать только в том случае, если у вас есть переопределяющие причины для отказа от использования Юникода, например соответствие более старому протоколу, который не поддерживает Юникод.
Многие функции поддержки национальных языков (NLS), такие как GetLocaleInfo и GetCalendarInfo, имеют определенные версии ANSI, в данном случае GetLocaleInfoA и GetCalendarInfoA соответственно. Если приложение использует версию ANSI функции с операционной системой на основе Юникода, например Windows NT, Windows 2000, Windows XP или Windows Vista, функция может завершиться ошибкой или привести к неопределенным результатам. Если у вас есть веская причина использовать функции ANSI с такой операционной системой, убедитесь, что данные, передаваемые приложением, действительны для ANSI.
Так как нормализация Юникода может изменить форму строки, механизмы безопасности или алгоритмы проверки символов обычно должны быть реализованы после нормализации. Например, рассмотрим приложение с веб-интерфейсом, которое принимает имя файла, но не принимает имя пути. Полноширинный U+FF43 U+FF1A U+FF3C U+FF57 U+FF49 U+FF4E U+FF44 U+FF4F U+FF57 U+FF53 (c : \ w i n d o w s)
изменяется на U+0063 U+001A U+003C U+0077 U+0069 U+006E U+0064 U+006F U+0077 U+0073 (c:\windows)
с нормализацией KC. Если приложение проверяет наличие двоеточия и символов обратной косой черты до реализации нормализации, результатом может быть непреднамеренный доступ к файлу.
Хотя нормализация Юникода является элементом обеспечения безопасности операционных систем, помните, что нормализация не является заменой комплексной политики безопасности.
Обучение
Модуль
Форматирование буквенно-цифровых данных для представления в C# - Training
Изучите основные методы в C# для форматирования буквенно-цифровых данных.