CA2101: Tentukan pemrosesan untuk argumen string P/Invoke

Properti Nilai
ID Aturan CA2101
Judul Tentukan pengelolaan data untuk argumen string P/Invoke
Kategori Globalisasi
Perbaikan bersifat merusak atau tidak merusak Tidak terputus
Diaktifkan secara default di .NET 10 Sebagai saran
Bahasa yang berlaku C# dan Visual Basic

Penyebab

Anggota panggilan platform memungkinkan dukungan untuk pemanggil yang tepercaya sebagian, serta memiliki parameter string dan tidak melakukan pengikatan string secara eksplisit.

Deskripsi aturan

Ketika Anda mengonversi dari Unicode ke ANSI, ada kemungkinan bahwa tidak semua karakter Unicode dapat diwakili di halaman kode ANSI tertentu. Pemetaan yang paling pas mencoba menyelesaikan masalah ini dengan mengganti karakter untuk karakter yang tidak dapat diwakili. Penggunaan fitur ini dapat menyebabkan potensi kerentanan keamanan karena Anda tidak dapat mengontrol karakter yang dipilih. Misalnya, kode berbahaya dapat dengan sengaja membuat string Unicode yang berisi karakter yang tidak ditemukan di halaman kode tertentu, yang dikonversi ke karakter khusus sistem file seperti '..' atau '/'. Perhatikan juga bahwa pemeriksaan keamanan untuk karakter khusus sering terjadi sebelum string dikonversi ke ANSI.

Pemetaan yang paling pas adalah default untuk konversi yang tidak dikelola, WChar ke MByte. Kecuali Anda secara eksplisit menonaktifkan pemetaan yang paling sesuai, kode Anda mungkin berisi kerentanan keamanan yang dapat dieksploitasi karena masalah ini.

Perhatian

Keamanan Akses Kode (CAS) tidak boleh dianggap sebagai batas keamanan.

Cara memperbaiki pelanggaran

Untuk memperbaiki pelanggaran aturan ini, kelola jenis data string secara eksplisit.

Kapan harus menekan peringatan

Jangan menyembunyikan peringatan dari aturan ini.

Contoh

Contoh berikut menunjukkan metode yang melanggar aturan ini, lalu menunjukkan cara memperbaiki pelanggaran.

class NativeMethods
{
    // Violates rule: SpecifyMarshalingForPInvokeStringArguments.
    [DllImport("advapi32.dll", CharSet = CharSet.Auto)]
    internal static extern int RegCreateKey(IntPtr key, String subKey, out IntPtr result);

    // Satisfies rule: SpecifyMarshalingForPInvokeStringArguments.
    [DllImport("advapi32.dll", CharSet = CharSet.Unicode)]
    internal static extern int RegCreateKey2(IntPtr key, String subKey, out IntPtr result);
}
Friend Class NativeMethods
    ' Violates rule: SpecifyMarshalingForPInvokeStringArguments.
    <DllImport("advapi32.dll", CharSet:=CharSet.Auto)>
    Friend Shared Function RegCreateKey(ByVal key As IntPtr, ByVal subKey As String, <Out> ByRef result As IntPtr) As Integer
    End Function

    ' Satisfies rule: SpecifyMarshalingForPInvokeStringArguments.
    <DllImport("advapi32.dll", CharSet:=CharSet.Unicode)>
    Friend Shared Function RegCreateKey2(ByVal key As IntPtr, ByVal subKey As String, <Out> ByRef result As IntPtr) As Integer
    End Function
End Class