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