Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
| 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);
}
}
Powiązane reguły
CA5393: Nie używaj niebezpiecznej wartości DllImportSearchPath