UTF-7 인코딩은 더 이상 애플리케이션에서 광범위하게 사용되지 않으며, 많은 사양이 이제 교환에서 사용을 금지 합니다. 또한 UTF-7로 인코딩된 데이터가 발생할 것으로 예상하지 않는 애플리케이션에서 공격 벡터로도 사용됩니다 . Microsoft는 System.Text.UTF7Encoding가 오류 감지를 제공하지 않으므로 사용하지 말라고 경고합니다.
따라서 Encoding.UTF7 속성 및 UTF7Encoding 생성자는 이제 사용되지 않습니다. 또한 Encoding.GetEncoding 및 Encoding.GetEncodings에서는 더 이상 UTF-7
을(를) 지정할 수 없습니다.
변경 내용 설명
이전에 Encoding.GetEncoding API를 사용하여 UTF-7 인코딩의 인스턴스를 만들 수 있었습니다. 다음은 그 예입니다.
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
로 전달할 수 있습니다. 이로 인해 악의적인 엔드포인트를 지정함으로써 수신 애플리케이션이 오작동할 수 있습니다.
또한 UTF-7 코드 경로를 사용하지 않도록 설정하면 Blazor에서 사용하는 것과 같은 컴파일러를 최적화하여 결과 애플리케이션에서 이러한 코드 경로를 완전히 제거할 수 있습니다. 결과적으로 컴파일된 애플리케이션은 더 효율적으로 실행되고 디스크 공간이 줄어듭니다.
도입된 버전
5.0
권장 작업
대부분의 경우 어떤 작업도 수행할 필요가 없습니다. 그러나 이전에 UTF-7 관련 코드 경로를 활성화한 앱의 경우 다음 지침을 고려합니다.
앱이 신뢰할 수 없는 원본에서 제공하는 알 수 없는 인코딩 이름을 사용하여 호출 Encoding.GetEncoding 하는 경우:
대신 인코딩 이름을 구성 가능한 허용 목록과 비교합니다. 구성 가능한 허용 목록에는 최소한 업계 표준 "utf-8"이 포함되어야 합니다. 클라이언트 및 규정 요구 사항에 따라 "GB18030"과 같은 지역별 인코딩을 허용해야 할 수도 있습니다.
허용 목록을 구현하지 않으면, 시스템에 기본적으로 내장되어 있는 Encoding.GetEncoding 또는 사용자 지정 Encoding을 통해 등록된 Encoding.GetEncoding을 에서 반환합니다. 서비스의 요구 사항을 감사하여 이것이 원하는 동작인지 확인합니다. 애플리케이션이 이 문서의 뒷부분에 언급된 호환성 스위치를 다시 사용하도록 설정하지 않는 한 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 사용 중단 경고만 비활성화됩니다. 다른 경고를 사용하지 않도록 설정하거나 다음과 같은 Encoding.GetEncodingAPI의 동작을 변경하지 않습니다.만약 지원
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()
.NET