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-7izin 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 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 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-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 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

Ç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ır new 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