Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Кодировка UTF-7 больше не используется среди приложений, и многие спецификации теперь запрещают его использование в обмене. Он также иногда используется в качестве вектора атаки в приложениях, которые не ожидают возникновения данных в кодировке UTF-7. Корпорация Майкрософт предупреждает об использовании System.Text.UTF7Encoding , так как она не обеспечивает обнаружение ошибок.
Следовательно, Encoding.UTF7 свойства и UTF7Encoding конструкторы теперь устарели. Кроме того, Encoding.GetEncoding и Encoding.GetEncodings больше не позволяют вам указать UTF-7.
Описание изменения
Ранее можно создать экземпляр кодировки UTF-7 с помощью Encoding.GetEncoding API. Рассмотрим пример.
Encoding enc1 = Encoding.GetEncoding("utf-7"); // By name.
Encoding enc2 = Encoding.GetEncoding(65000); // By code page.
Кроме того, экземпляр, представляющий кодировку UTF-7, был перечислен методом Encoding.GetEncodings() , который перечисляет все Encoding экземпляры, зарегистрированные в системе.
Начиная с .NET 5, Encoding.UTF7 свойства и UTF7Encoding конструкторы устарели и создают предупреждение SYSLIB0001. Тем не менее, чтобы уменьшить количество предупреждений, которые пользователи получают при использовании UTF7Encoding класса, тип UTF7Encoding не отмечен как устаревший.
// The next line generates warning SYSLIB0001.
UTF7Encoding enc = new UTF7Encoding();
// The next line does not generate a warning.
byte[] bytes = enc.GetBytes("Hello world!");
Кроме того, Encoding.GetEncoding методы рассматривают имя utf-7 кодирования и кодовую страницу 65000 как unknown. Обработка кодировки как unknown причиняет методу вызвать исключение ArgumentException.
// Throws ArgumentException, same as calling Encoding.GetEncoding("unknown").
Encoding enc = Encoding.GetEncoding("utf-7");
Наконец, Encoding.GetEncodings() метод не включает кодировку UTF-7 в EncodingInfo массив, который он возвращает. Кодировка исключена, так как она не может быть создана.
foreach (EncodingInfo encInfo in Encoding.GetEncodings())
{
// The next line would throw if GetEncodings included UTF-7.
Encoding enc = Encoding.GetEncoding(encInfo.Name);
}
Причина изменения
Многие приложения вызывают Encoding.GetEncoding("encoding-name") с именем кодировки, которое предоставлено ненадежным источником. Например, веб-клиент или сервер могут принимать charset часть заголовка Content-Type и передавать значение напрямую Encoding.GetEncoding без проверки. Это может позволить вредоносной конечной точке указать Content-Type: ...; charset=utf-7, что может привести к неправильному поведению принимающего приложения.
Кроме того, отключение путей кода UTF-7 позволяет оптимизировать компиляторы, такие как те, которые используются Blazor, для удаления этих путей кода полностью из результирующего приложения. В результате скомпилированные приложения работают более эффективно и занимают меньше места на диске.
Представленная версия
5,0
Рекомендуемое действие
В большинстве случаев вам не нужно предпринимать никаких действий. Однако для приложений, которые ранее активировали пути кода, связанные с UTF-7, рассмотрите приведенные ниже рекомендации.
Если ваше приложение вызывает Encoding.GetEncoding с неизвестными именами кодировки, предоставленными ненадежным источником:
Вместо этого сравните имена кодировки с настраиваемым списком разрешений. Настраиваемый список разрешенных элементов должен содержать как минимум отраслевой стандарт "utf-8". В зависимости от клиентов и нормативных требований может потребоваться также разрешить кодирование для конкретных регионов, например "GB18030".
Если вы не реализуете список разрешений, Encoding.GetEncoding вернется любой Encoding , встроенный в систему или зарегистрированный с помощью пользовательского EncodingProvider. Проверьте требования вашей службы, чтобы убедиться, что это нужное поведение. По умолчанию UTF-7 будет отключен, если приложение не включает переключатель совместимости, упомянутый далее в этой статье.
Если вы используете Encoding.UTF7 или UTF7Encoding в собственном протоколе или формате файла:
Переключение на использование Encoding.UTF8 или UTF8Encoding. UTF-8 является отраслевым стандартом и широко поддерживается на разных языках, операционных системах и средах выполнения. Использование UTF-8 упрощает дальнейшее обслуживание кода и делает его более совместимым с остальной частью экосистемы.
Если вы сравниваете Encoding экземпляр с Encoding.UTF7:
Вместо этого попробуйте выполнить проверку на общеизвестную кодовую страницу UTF-7, которая является
65000. Сравнивая страницу кодов, вы избегаете предупреждения, а также обрабатываете некоторые пограничные случаи, например, если кто-то вызвалnew UTF7Encoding()или создал подкласс для типа.void DoSomething(Encoding enc) { // Don't perform the check this way. // It produces a warning and misses some edge cases. if (enc == Encoding.UTF7) { // Encoding is UTF-7. } // Instead, perform the check this way. if (enc != null && enc.CodePage == 65000) { // Encoding is UTF-7. } }Если необходимо использовать Encoding.UTF7 или UTF7Encoding:
Предупреждение можно отключить
SYSLIB0001в коде проекта или в его csproj-файле.#pragma warning disable SYSLIB0001 // Disable the warning. Encoding enc = Encoding.UTF7; #pragma warning restore SYSLIB0001 // Re-enable the warning.<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net5.0</TargetFramework> <!-- NoWarn below suppresses SYSLIB0001 project-wide --> <NoWarn>$(NoWarn);SYSLIB0001</NoWarn> </PropertyGroup> </Project>Замечание
Подавление
SYSLIB0001отключает только предупреждения об устаревании Encoding.UTF7 и UTF7Encoding. Он не отключает другие предупреждения или не изменяет поведение API, например Encoding.GetEncoding.Если необходимо поддерживать
Encoding.GetEncoding("utf-7", ...):Вы можете повторно включить поддержку этого с помощью коммутатора совместимости. Этот параметр совместимости можно указать в CSPROJ-файле приложения или в файле конфигурации среды выполнения, как показано в следующих примерах.
В CSPROJ-файле приложения:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net5.0</TargetFramework> <!-- Re-enable support for UTF-7 --> <EnableUnsafeUTF7Encoding>true</EnableUnsafeUTF7Encoding> </PropertyGroup> </Project>В файлеruntimeconfig.template.json приложения:
{ "configProperties": { "System.Text.Encoding.EnableUnsafeUTF7Encoding": true } }Подсказка
Если вы повторно включите поддержку UTF-7, необходимо выполнить проверку безопасности кода, который вызывает Encoding.GetEncoding.
Затронутые API
- System.Text.Encoding.UTF7
- UTF7Encoding()
- UTF7Encoding(Boolean)
- System.Text.Encoding.GetEncoding(Int32)
- System.Text.Encoding.GetEncoding(String)
- System.Text.Encoding.GetEncoding(Int32, EncoderFallback, DecoderFallback)
- System.Text.Encoding.GetEncoding(String, EncoderFallback, DecoderFallback)
- System.Text.Encoding.GetEncodings()