Udostępnij za pośrednictwem


CA5392: Użyj atrybutu DefaultDllImportSearchPaths dla P/Invoke

Właściwości Wartość
Identyfikator reguły CA5392
Tytuł Użyj atrybutu DefaultDllImportSearchPaths dla wywołań P/Invoke
Kategoria Bezpieczeństwo
Poprawka łamiąca lub nienaruszająca Niezgodność
Domyślnie włączone na platformie .NET 10 Nie.
Zastosowane języki C# i Visual Basic

Przyczyna

Parametr DefaultDllImportSearchPathsAttribute nie jest określony dla funkcji Platform Invoke (P/Invoke).

Opis reguły

Domyślnie funkcje P/Invoke korzystające z DllImportAttribute przeszukują wiele katalogów, w tym również bieżący katalog roboczy, aby załadować bibliotekę. Może to być problem z zabezpieczeniami niektórych aplikacji, co prowadzi do porwania bibliotek DLL.

Jeśli na przykład złośliwa biblioteka DLL o takiej samej nazwie jak zaimportowana zostanie umieszczona w bieżącym katalogu roboczym, który zostanie przeszukany domyślnie, można załadować złośliwą bibliotekę DLL.

Aby uzyskać więcej informacji, zobacz Bezpieczne ładowanie biblioteki.

Jak naprawić naruszenia

Użyj DefaultDllImportSearchPathsAttribute do jawnego określenia ścieżki przeszukiwania DLL dla zestawu lub metody.

Kiedy pomijać ostrzeżenia

Można bezpiecznie pominąć tę regułę, jeśli:

  • Czy jesteś pewien, że załadowany zestaw jest tym, czego chcesz? Na przykład aplikacja działa na zaufanym serwerze i całkowicie ufasz plikom.
  • Zaimportowany zestaw jest często używaną biblioteką systemową, na przykład user32.dll, i strategia ścieżki wyszukiwania jest zgodna z mechanizmem Mechanizm Znanych Bibliotek DLL.

Pomijanie ostrzeżenia

Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.

#pragma warning disable CA5392
// The code that's violating the rule is on this line.
#pragma warning restore CA5392

Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji.

[*.{cs,vb}]
dotnet_diagnostic.CA5392.severity = none

Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.

Przykłady pseudokodu

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);
    }
}

Rozwiązanie

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);
    }
}

CA5393: Nie używaj niebezpiecznej wartości DllImportSearchPath