UTF-7 kod yolları kullanımdan kaldırıldı
UTF-7 kodlaması artık uygulamalar arasında geniş kullanımda değildir ve birçok belirtim artık değişimde kullanılmasını yasaklar. Ayrıca bazen UTF-7 ile kodlanmış verilerle karşılaşmayı öngörmeyecek uygulamalarda bir saldırı vektöru olarak da kullanılır. Microsoft, hata algılama sağlamadığından kullanımına System.Text.UTF7Encoding karşı uyarır.
Sonuç olarak, Encoding.UTF7 özellik ve UTF7Encoding oluşturucular artık kullanım dışıdır. Ayrıca ve Encoding.GetEncodingEncoding.GetEncodings artık belirtmenize UTF-7
izin vermiyor.
Açıklama değiştirildi
Daha önce API'leri kullanarak UTF-7 kodlamasının bir örneğini Encoding.GetEncoding oluşturabilirsiniz. Örneğin:
Encoding enc1 = Encoding.GetEncoding("utf-7"); // By name.
Encoding enc2 = Encoding.GetEncoding(65000); // By code page.
Ayrıca, UTF-7 kodlamasını temsil eden bir örnek, sistemde kayıtlı tüm Encoding örnekleri numaralandıran yöntemi tarafından Encoding.GetEncodings() numaralandırıldı.
.NET 5'den başlayarak özelliği Encoding.UTF7 ve UTF7Encoding oluşturucuları kullanım dışıdır ve uyarı SYSLIB0001
üretir. Ancak, çağıranların sınıfını kullanırken UTF7Encoding aldığı uyarı sayısını azaltmak için türün UTF7Encoding kendisi eski olarak işaretlenmez.
// The next line generates warning SYSLIB0001.
UTF7Encoding enc = new UTF7Encoding();
// The next line does not generate a warning.
byte[] bytes = enc.GetBytes("Hello world!");
Ayrıca, Encoding.GetEncoding yöntemler kodlama adını utf-7
ve kod sayfasını 65000
olarak unknown
ele alır. Kodlamayı olarak unknown
ele almak, yönteminin bir ArgumentExceptionoluşturmasına neden olur.
// Throws ArgumentException, same as calling Encoding.GetEncoding("unknown").
Encoding enc = Encoding.GetEncoding("utf-7");
Son olarak yöntemi, Encoding.GetEncodings() döndürdüğü dizide UTF-7 kodlamasını EncodingInfo içermez. Kodlama örneği oluşturulamadığı için dışlanır.
foreach (EncodingInfo encInfo in Encoding.GetEncodings())
{
// The next line would throw if GetEncodings included UTF-7.
Encoding enc = Encoding.GetEncoding(encInfo.Name);
}
Değişiklik nedeni
Birçok uygulama, güvenilmeyen bir kaynak tarafından sağlanan bir kodlama adı değeriyle çağırır Encoding.GetEncoding("encoding-name")
. Örneğin, bir web istemcisi veya sunucusu üst bilginin bir bölümünü Content-Type
alabilir charset
ve değeri doğrulamadan doğrudan öğesine Encoding.GetEncoding
geçirebilir. Bu, kötü amaçlı bir uç noktanın belirtilmesine Content-Type: ...; charset=utf-7
izin verebilir ve bu da alıcı uygulamanın yanlış davranmasına neden olabilir.
Ayrıca UTF-7 kod yollarını devre dışı bırakmak, Blazor tarafından kullanılanlar gibi derleyicilerin bu kod yollarının sonuçta elde edilen uygulamadan tamamen kaldırılmasını sağlar. Sonuç olarak, derlenen uygulamalar daha verimli çalışır ve daha az disk alanı alır.
Sürüm kullanıma sunulmuştur
5.0
Önerilen eylem
Çoğu durumda herhangi bir işlem yapmanız gerekmez. Ancak, DAHA önce UTF-7 ile ilgili kod yollarını etkinleştirmiş olan uygulamalar için aşağıdaki yönergeleri göz önünde bulundurun.
Uygulamanız güvenilmeyen bir kaynak tarafından sağlanan bilinmeyen kodlama adlarıyla çağırırsa Encoding.GetEncoding :
Bunun yerine, kodlama adlarını yapılandırılabilir izin verme listesiyle karşılaştırın. Yapılandırılabilir izin verilenler listesi en azından endüstri standardı "utf-8" içermelidir. İstemcilerinize ve mevzuat gereksinimlerinize bağlı olarak, "GB18030" gibi bölgeye özgü kodlamalara da izin vermeniz gerekebilir.
İzin verme listesi uygulamazsanız, Encoding.GetEncoding sistemde yerleşik olarak bulunan veya özel EncodingProviderbir aracılığıyla kaydedilen herhangi Encoding bir öğeyi döndürür. Bunun istenen davranış olduğunu doğrulamak için hizmetinizin gereksinimlerini denetleyin. Uygulamanız bu makalenin devamında belirtilen uyumluluk anahtarını yeniden etkinleştirmediği sürece UTF-7 varsayılan olarak devre dışı bırakılmaya devam eder.
Kendi protokolünüzü veya UTF7Encoding dosya biçiminizi kullanıyorsanız Encoding.UTF7 veya kullanıyorsanız:
veya UTF8Encodingkullanmaya Encoding.UTF8 geçin. UTF-8 bir endüstri standardıdır ve diller, işletim sistemleri ve çalışma zamanları arasında yaygın olarak desteklenir. UTF-8'i kullanmak kodunuzun gelecekteki bakımlarını kolaylaştırır ve ekosistemin geri kalanıyla daha birlikte çalışabilir hale getirir.
Bir Encoding örneği Encoding.UTF7ile karşılaştırıyorsanız:
Bunun yerine, iyi bilinen UTF-7 kod sayfasında (olan
65000
) bir denetim gerçekleştirmeyi göz önünde bulundurun. Kod sayfasıyla karşılaştırarak uyarıdan kaçınmış olursunuz ve ayrıca biri tarafından çağrılırnew UTF7Encoding()
veya türü alt sınıflandırmış gibi bazı uç durumlarını işlersiniz.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. } }
veya UTF7Encodingkullanmanız Encoding.UTF7 gerekiyorsa:
Uyarıyı
SYSLIB0001
kodda veya projenizin .csproj dosyasında gizleyebilirsiniz.#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>
Not
Gizlenmesi
SYSLIB0001
yalnızca ve UTF7Encoding kullanımdan kaldırılma uyarılarını devre dışı bırakırEncoding.UTF7. Diğer uyarıları devre dışı bırakmaz veya gibi Encoding.GetEncodingAPI'lerin davranışını değiştirmez.desteklemeniz
Encoding.GetEncoding("utf-7", ...)
gerekiyorsa:Bunun için desteği bir uyumluluk anahtarı aracılığıyla yeniden etkinleştirebilirsiniz. Bu uyumluluk anahtarı, aşağıdaki örneklerde gösterildiği gibi uygulamanın .csproj dosyasında veya çalışma zamanı yapılandırma dosyasında belirtilebilir.
Uygulamanın .csproj dosyasında:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net5.0</TargetFramework> <!-- Re-enable support for UTF-7 --> <EnableUnsafeUTF7Encoding>true</EnableUnsafeUTF7Encoding> </PropertyGroup> </Project>
Uygulamanın runtimeconfig.template.json dosyasında:
{ "configProperties": { "System.Text.Encoding.EnableUnsafeUTF7Encoding": true } }
İpucu
UTF-7 desteğini yeniden etkinleştirirseniz, çağıran Encoding.GetEncodingkodun güvenlik gözden geçirmesini gerçekleştirmeniz gerekir.
Etkilenen API’ler
- 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()