Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
| Özellik | Değer |
|---|---|
| Kural Kimliği | CA5392 |
| Başlık | P/Invokes için DefaultDllImportSearchPaths özniteliğini kullanın |
| Kategori | Güvenlik |
| Düzeltme bozucu ya da bozmayan olabilir | Kesintisiz |
| .NET 10'da varsayılan olarak etkin | Hayır |
| Geçerli diller | C# ve Visual Basic |
Neden
"DefaultDllImportSearchPathsAttributeBir Platform Çağırma (P/Invoke) işlevi için belirtilmemiş."
Kural açıklaması
Varsayılan olarak P/Invoke işlevi, kitaplığın yüklenecek geçerli çalışma dizini de dahil olmak üzere bir dizi dizini yoklayarak DllImportAttribute çalışır. Bu, belirli uygulamalar için dll ele geçirmesine yol açan bir güvenlik sorunu olabilir.
Örneğin, içeri aktarılanla aynı ada sahip kötü amaçlı bir DLL, varsayılan olarak ilk olarak aranacak olan geçerli çalışma dizininin altına yerleştirilirse, kötü amaçlı DLL yüklenebilir.
Daha fazla bilgi için bkz. Kitaplığı Güvenli Bir Şekilde Yükleme.
İhlalleri düzeltme
Derleme veya yöntemi için DLL arama yolunu açıkça belirtmek için kullanın DefaultDllImportSearchPathsAttribute .
Uyarıların ne zaman bastırılması gerekiyor?
Şu durumda bu kuralı gizlemek güvenlidir:
- Yüklenen montajın istediğiniz olduğundan emin misiniz? Örneğin, uygulamanız güvenilir bir sunucuda çalışır ve dosyalara tamamen güvenirsiniz.
- İçeri aktarılan derleme, user32.dll gibi yaygın olarak kullanılan bir sistem derlemesidir ve arama yolu stratejisi Bilinen DLL'ler mekanizmasını izler.
Uyarıyı gizleme
Yalnızca tek bir ihlali engellemek istiyorsanız, kuralı devre dışı bırakmak ve sonra yeniden etkinleştirmek için kaynak dosyanıza ön işlemci yönergeleri ekleyin.
#pragma warning disable CA5392
// The code that's violating the rule is on this line.
#pragma warning restore CA5392
Bir dosya, klasör veya projenin kuralını devre dışı bırakmak için, yapılandırma dosyasındaki önem derecesini noneolarak ayarlayın.
[*.{cs,vb}]
dotnet_diagnostic.CA5392.severity = none
Daha fazla bilgi için bkz . Kod analizi uyarılarını gizleme.
Sahte kod örnekleri
using System;
using System.Runtime.InteropServices;
class ExampleClass
{
[DllImport("The3rdAssembly.dll")]
public static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type);
public void ExampleMethod()
{
MessageBox(new IntPtr(0), "Hello World!", "Hello Dialog", 0);
}
}
Çözüm
using System;
using System.Runtime.InteropServices;
class ExampleClass
{
[DllImport("The3rdAssembly.dll")]
[DefaultDllImportSearchPaths(DllImportSearchPath.UserDirectories)]
public static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type);
public void ExampleMethod()
{
MessageBox(new IntPtr(0), "Hello World!", "Hello Dialog", 0);
}
}
İlgili kurallar
CA5393: Güvenli olmayan DllImportSearchPath değeri kullanmayın