CA5393: Güvenli olmayan DllImportSearchPath değeri kullanmayın

Özellik Değer
Kural Kimliği CA5393
Başlık Güvenli olmayan DllImportSearchPath değeri kullanmayın
Kategori Güvenlik
Hataya neden olan veya bozulmayan düzeltme Hataya neden olmayan
.NET 8'de varsayılan olarak etkin Hayır

Neden

xref:System.Runtime.InteropServices.DllImportSearchPath?displayProperty=fullName'in <güvenli olmayan değerlerinden birini kullanarak:

  • AssemblyDirectory
  • UseDllDirectoryForDependencies
  • ApplicationDirectory
  • LegacyBehavior

Kural açıklaması

Varsayılan DLL arama dizinlerinde ve derleme dizinlerinde kötü amaçlı bir DLL olabilir. Ya da uygulamanızın nereden çalıştırıldığına bağlı olarak, uygulamanın dizininde kötü amaçlı bir DLL olabilir.

Daha fazla bilgi için bkz. Kasa ly Yükleme Kitaplığı.

İhlalleri düzeltme

Bunun yerine açık bir arama yolu belirtmek için güvenli değerlerini DllImportSearchPath kullanın:

  • SafeDirectories
  • System32
  • UserDirectories

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

Şu durumda bu kuralın gizlenmek güvenlidir:

  • Yüklenen derlemenin istediğiniz şey olduğundan eminsiniz.
  • İç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 CA5393
// The code that's violating the rule is on this line.
#pragma warning restore CA5393

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.CA5393.severity = none

Daha fazla bilgi için bkz . Kod analizi uyarılarını gizleme.

Çözümlemek için kod yapılandırma

Bu kuralın kod tabanınızın hangi bölümlerinde çalıştırılacaklarını yapılandırmak için aşağıdaki seçeneği kullanın.

Bu seçeneği yalnızca bu kural, geçerli olduğu tüm kurallar veya bu kategorideki (Güvenlik) tüm kurallar için yapılandırabilirsiniz. Daha fazla bilgi için bkz . Kod kalitesi kuralı yapılandırma seçenekleri.

Güvenli Olmayan DllImportSearchPath bitleri

Çözümleme için hangi değerinin DllImportSearchPath güvenli olmadığını yapılandırabilirsiniz. Örneğin, kodun , UseDllDirectoryForDependencies veya kullanmaması AssemblyDirectorygerektiğini belirtmek için projenizdeki bir .editorconfig dosyasına aşağıdaki anahtar-değer ApplicationDirectoryçiftini ekleyin:

dotnet_code_quality.CA5393.unsafe_DllImportSearchPath_bits = 770

Sabit listesi değerlerinin bit düzeyinde bir bileşiminin tamsayı değerini belirtmeniz gerekir.

Sahte kod örnekleri

using System;
using System.Runtime.InteropServices;

class ExampleClass
{
    [DllImport("The3rdAssembly.dll")]
    [DefaultDllImportSearchPaths(DllImportSearchPath.AssemblyDirectory)]
    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);
    }
}

CA5392: P/Invokes için DefaultDllImportSearchPaths özniteliğini kullanın