Aracılığıyla paylaş


CA2101: P/Invoke dize bağımsız değişkenleri için sıralamayı belirtin

Özellik Değer
Kural Kimliği CA2101
Başlık P/Invoke dize bağımsız değişkenleri için sıralama belirtme
Kategori Globalleştirme
Hataya neden olan veya bozulmayan düzeltme Hataya neden olmayan
.NET 8'de varsayılan olarak etkin Öneri olarak

Neden

Platform çağırma üyesi kısmen güvenilen arayanlara izin verir, bir dize parametresine sahiptir ve dizeyi açıkça hazırlamaz.

Kural açıklaması

Unicode'dan ANSI'ye dönüştürdüğünüzde, tüm Unicode karakterlerinin belirli bir ANSI kod sayfasında temsil edilemeyebilir. En uygun eşleme , temsil edilemeyen karakterin yerine bir karakter girerek bu sorunu çözmeye çalışır. Seçilen karakteri denetleyemediğiniz için bu özelliğin kullanılması olası bir güvenlik açığına neden olabilir. Örneğin, kötü amaçlı kod kasıtlı olarak belirli bir kod sayfasında bulunmayan karakterler içeren ve '..' gibi dosya sistemi özel karakterlerine dönüştürülen bir Unicode dizesi oluşturabilir veya '/'. Dize ANSI'ye dönüştürülmeden önce özel karakterler için güvenlik denetimlerinin sık sık gerçekleştiğini de unutmayın.

En uygun eşleme, WChar'dan MByte'e yönetilmeyen dönüştürme için varsayılan değerdir. En uygun eşlemeyi açıkça devre dışı bırakmadığınız sürece, kodunuz bu sorun nedeniyle güvenlik açığından yararlanılabilir bir güvenlik açığı içerebilir.

Dikkat

Kod Erişim Güvenliği (CAS) bir güvenlik sınırı olarak kabul edilmemelidir.

İhlalleri düzeltme

Bu kuralın ihlalini düzeltmek için dize veri türlerini açıkça sırala.

Uyarıların ne zaman bastırılması gerekiyor?

Bu kuraldan uyarıyı bastırmayın.

Örnek

Aşağıdaki örnek, bu kuralı ihlal eden bir yöntemi gösterir ve ardından ihlalin nasıl düzeltileceğini gösterir.

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