Udostępnij za pośrednictwem


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

Właściwości Wartość
Identyfikator reguły CA5392
Tytuł 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 9 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 Bezpieczne ładowanie biblioteki.

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