Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
UTF-7 kodlaması artık uygulamalar arasında geniş çapta kullanılmamaktadır ve birçok standart artık değişimde kullanılmasını yasaklamaktadır. 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, System.Text.UTF7Encoding kullanımına, hata algılama sağlamadığından karşı uyarır.
Sonuç olarak, Encoding.UTF7 özellik ve UTF7Encoding oluşturucular artık kullanım dışıdır. Ayrıca, Encoding.GetEncoding ve Encoding.GetEncodings, artık UTF-7 belirtmenize izin vermiyor.
Açıklamayı değiştir
Önceden Encoding.GetEncoding API'lerini kullanarak UTF-7 kodlamasının bir örneğini oluşturabiliyordunuz. Ö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.GetEncodings() örneklerini numaralandıran Encoding yöntemi tarafından sayıldı.
.NET 5'ten itibaren Encoding.UTF7 özellik ve UTF7Encoding oluşturucuları kullanım dışıdır ve uyarı SYSLIB0001 oluşturur. Ancak, çağıranların UTF7Encoding sınıfını kullanırken aldığı uyarı sayısını azaltmak için, UTF7Encoding türü 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 unknownele 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, döndürülen Encoding.GetEncodings() dizisinde EncodingInfo yöntemi UTF-7 kodlamasını içermez. Kodlama örneği oluşturulamadığı için haricinde tutulur.
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 charset üst bilgisinin Content-Type bölümünü alabilir ve değeri doğrulamadan doğrudan Encoding.GetEncoding öğesine iletebilir. Bu, kötü amaçlı bir uç noktanın belirtilmesine Content-Type: ...; charset=utf-7izin 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 gibi derleyicilerin kod yollarını optimize etmesini ve sonucu elde edilen uygulamadan tamamen kaldırması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 listesi uygulamazsanız, Encoding.GetEncoding sistemde yerleşik olan veya özel Encoding ile kaydedilen herhangi bir EncodingProvider 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üzde veya dosya biçiminizde Encoding.UTF7 veya UTF7Encoding kullanıyorsanız:
Encoding.UTF8 veya UTF8Encoding kullanmaya 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ı
65000'ye karşı bir denetim gerçekleştirmeyi göz önünde bulundurun. Kod sayfasını karşılaştırarak uyarıdan kaçınabilir ve birinew UTF7Encoding()öğesini çağırdığında ya da türü alt sınıflandırdığında ortaya çıkan bazı uç durumları yönetebilirsiniz.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 veya UTF7Encoding kullanmanız gerekiyorsa:
Uyarıyı
SYSLIB0001kodda 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>Uyarı
SYSLIB0001'ü bastırmak yalnızca Encoding.UTF7 ve UTF7Encoding kullanımdan kaldırılma uyarılarını devre dışı bırakır. Diğer uyarıları devre dışı bırakmaz veya gibi Encoding.GetEncodingAPI'lerin davranışını değiştirmez.Eğer
Encoding.GetEncoding("utf-7", ...)desteklemeniz 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 } }Tavsiye
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()