Bagikan melalui


Jalur kode UTF-7 sudah kedaluwarsa

Pengodean UTF-7 tidak lagi digunakan secara luas di antara aplikasi, dan banyak spesifikasi sekarang melarang penggunaannya dalam pertukaran. Ini juga kadang-kadang digunakan sebagai vektor serangan dalam aplikasi yang tidak mengantisipasi menemukan data yang dikodekan UTF-7. Microsoft memperingatkan terhadap penggunaan System.Text.UTF7Encoding karena tidak memberikan deteksi kesalahan.

Akibatnya, Encoding.UTF7 properti dan UTF7Encoding konstruktor sekarang usang. Selain itu, Encoding.GetEncoding dan Encoding.GetEncodings tidak lagi memungkinkan Anda menentukan UTF-7.

Ubah deskripsi

Sebelumnya, Anda dapat membuat instans pengodean UTF-7 dengan menggunakan Encoding.GetEncoding API. Contohnya:

Encoding enc1 = Encoding.GetEncoding("utf-7"); // By name.
Encoding enc2 = Encoding.GetEncoding(65000); // By code page.

Selain itu, instans yang mewakili pengodean UTF-7 dijumlahkan oleh Encoding.GetEncodings() metode , yang menghitung semua Encoding instans yang terdaftar pada sistem.

Mulai di .NET 5, Encoding.UTF7 properti dan UTF7Encoding konstruktor sudah usang dan menghasilkan peringatan SYSLIB0001. Namun, untuk mengurangi jumlah peringatan yang diterima pengguna saat menggunakan kelas UTF7Encoding, tipe UTF7Encoding itu sendiri tidak diberi tanda usang atau kadaluwarsa.

// The next line generates warning SYSLIB0001.
UTF7Encoding enc = new UTF7Encoding();
// The next line does not generate a warning.
byte[] bytes = enc.GetBytes("Hello world!");

Selain itu, metode itu memperlakukan nama pengodean Encoding.GetEncoding dan kode halaman utf-7 sebagai 65000. Memperlakukan pengodean sebagai unknown menyebabkan metode mengeluarkan ArgumentException.

// Throws ArgumentException, same as calling Encoding.GetEncoding("unknown").
Encoding enc = Encoding.GetEncoding("utf-7");

Terakhir, Encoding.GetEncodings() metode ini tidak menyertakan pengodean UTF-7 dalam EncodingInfo array yang dikembalikannya. Pengkodean dikecualikan karena tidak dapat diinstansiasi.

foreach (EncodingInfo encInfo in Encoding.GetEncodings())
{
    // The next line would throw if GetEncodings included UTF-7.
    Encoding enc = Encoding.GetEncoding(encInfo.Name);
}

Alasan perubahan

Banyak aplikasi memanggil Encoding.GetEncoding("encoding-name") dengan nilai nama pengodean yang disediakan oleh sumber yang tidak tepercaya. Misalnya, klien web atau server mungkin mengambil charset bagian header Content-Type dan meneruskan nilai langsung ke Encoding.GetEncoding tanpa memvalidasinya. Hal ini dapat memungkinkan titik akhir berbahaya untuk menentukan Content-Type: ...; charset=utf-7, yang dapat menyebabkan aplikasi penerima berfungsi tidak semestinya.

Selain itu, menonaktifkan jalur kode UTF-7 memungkinkan pengoptimalan pengkompilasi, seperti yang digunakan oleh Blazor, untuk menghapus jalur kode ini sepenuhnya dari aplikasi yang dihasilkan. Akibatnya, aplikasi yang dikompilasi berjalan lebih efisien dan membutuhkan lebih sedikit ruang disk.

Versi yang diperkenalkan

5.0

Dalam kebanyakan kasus, Anda tidak perlu mengambil tindakan apa pun. Namun, untuk aplikasi yang sebelumnya telah mengaktifkan jalur kode terkait UTF-7, pertimbangkan panduan berikut.

  • Jika aplikasi Anda memanggil Encoding.GetEncoding dengan nama pengodean yang tidak diketahui yang disediakan oleh sumber yang tidak tepercaya:

    Sebagai gantinya, bandingkan nama pengkodean dengan daftar yang diizinkan yang dapat dikonfigurasi. Daftar izin yang dapat dikonfigurasi harus minimal mencakup "utf-8" standar industri. Bergantung pada klien dan persyaratan peraturan Anda, Anda mungkin juga perlu mengizinkan pengodean khusus wilayah, seperti "GB18030".

    Jika Anda tidak menerapkan daftar izin, Encoding.GetEncoding akan mengembalikan apa saja Encoding yang sudah ada di sistem atau yang terdaftar melalui metode kustom EncodingProvider. Audit persyaratan layanan Anda untuk memvalidasi bahwa ini adalah perilaku yang diinginkan. UTF-7 terus dinonaktifkan secara default kecuali aplikasi Anda mengaktifkan kembali sakelar kompatibilitas yang disebutkan nanti dalam artikel ini.

  • Jika Anda menggunakan Encoding.UTF7 atau UTF7Encoding dalam protokol atau format file Anda sendiri:

    Beralih ke menggunakan Encoding.UTF8 atau UTF8Encoding. UTF-8 adalah standar industri dan didukung secara luas di seluruh bahasa, sistem operasi, dan runtime. Menggunakan UTF-8 memudahkan pemeliharaan kode Anda di masa mendatang dan membuatnya lebih dapat dioperasikan dengan sisa ekosistem.

  • Jika Anda membandingkan instance Encoding dengan Encoding.UTF7:

    Sebagai gantinya, pertimbangkan untuk melakukan pemeriksaan terhadap halaman kode UTF-7 terkenal, yaitu 65000. Dengan membandingkan dengan halaman kode, Anda menghindari peringatan dan juga menangani beberapa kasus tepi, seperti jika seseorang memanggil new UTF7Encoding() atau mensubkelas jenisnya.

    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.
        }
    }
    
  • Jika Anda harus menggunakan Encoding.UTF7 atau UTF7Encoding:

    Anda dapat menekan peringatan SYSLIB0001 dalam program kode atau dalam file .csproj proyek Anda.

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

    Nota

    Menekan SYSLIB0001 hanya menonaktifkan peringatan kedaluarsa Encoding.UTF7 dan UTF7Encoding. Ini tidak menonaktifkan peringatan lain atau mengubah perilaku API seperti Encoding.GetEncoding.

  • Jika Anda harus mendukung Encoding.GetEncoding("utf-7", ...):

    Anda dapat mengaktifkan kembali dukungan untuk ini melalui sakelar kompatibilitas. Sakelar kompatibilitas ini dapat ditentukan dalam file .csproj aplikasi atau dalam file konfigurasi runtime, seperti yang ditunjukkan dalam contoh berikut.

    Dalam file .csproj dari aplikasi:

    <Project Sdk="Microsoft.NET.Sdk">
      <PropertyGroup>
       <TargetFramework>net5.0</TargetFramework>
       <!-- Re-enable support for UTF-7 -->
       <EnableUnsafeUTF7Encoding>true</EnableUnsafeUTF7Encoding>
      </PropertyGroup>
    </Project>
    

    File runtimeconfig.template.json dalam aplikasi:

    {
      "configProperties": {
        "System.Text.Encoding.EnableUnsafeUTF7Encoding": true
      }
    }
    

    Petunjuk / Saran

    Jika Anda mengaktifkan kembali dukungan untuk UTF-7, Anda harus melakukan tinjauan keamanan kode yang memanggil Encoding.GetEncoding.

API yang terpengaruh