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);
}
}
Powiązane reguły
CA5393: Nie używaj niebezpiecznej wartości DllImportSearchPath