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