CA5392: Użyj atrybutu DefaultDllImportSearchPaths dla parametrów P/Invoke

Właściwości Wartość
Identyfikator reguły CA5392
Stanowisko Użyj atrybutu DefaultDllImportSearchPaths dla elementów P/Invoke
Kategoria Bezpieczeństwo
Poprawka powodująca niezgodność lub niezgodność Niezgodność
Domyślnie włączone na platformie .NET 8 Nie.

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 sondowania wielu katalogów, w tym bieżącego katalogu roboczego do załadowania biblioteki. 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 Load Library Sejf ly (Ładowanie biblioteki Sejf ly).

Jak naprawić naruszenia

Użyj DefaultDllImportSearchPathsAttribute polecenia , aby jawnie określić ścieżkę wyszukiwania biblioteki DLL dla zestawu lub metody.

Kiedy pomijać ostrzeżenia

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

  • Masz pewność, że załadowany zestaw jest odpowiedni. Na przykład aplikacja działa na zaufanym serwerze i całkowicie ufasz plikom.
  • Zaimportowany zestaw jest często używanym zestawem systemowym, na przykład user32.dll, a strategia ścieżki wyszukiwania jest zgodna z mechanizmem Znane biblioteki 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 przykładów kodu przykładowego

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