Bagikan melalui


CA2101: Tentukan penyusunan untuk argumen string P/Invoke

Properti Nilai
ID Aturan CA2101
Judul Tentukan marshalling untuk argumen string P/Invoke
Golongan Globalisasi
Perbaikan bersifat disruptif atau non-disruptif Non-disruptif
Diaktifkan secara default di .NET 8 Sebagai saran

Penyebab

Anggota pemanggil platform memungkinkan pemanggil tepercaya sebagian, memiliki parameter string, dan tidak secara eksplisit melakukan marshal string.

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, secara eksplisit marshal jenis data string.

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