CA5392: Använd attributet DefaultDllImportSearchPaths för P/Invokes
Property | Värde |
---|---|
Regel-ID | CA5392 |
Title | Använda attributet DefaultDllImportSearchPaths för P/Invokes |
Kategori | Säkerhet |
Korrigeringen är icke-bakåtkompatibel | Icke-icke-bryta |
Aktiverad som standard i .NET 9 | Nej |
Orsak
DefaultDllImportSearchPathsAttribute har inte angetts för en P/Invoke-funktion (Platform Invoke).
Regelbeskrivning
P/Invoke-funktioner använder DllImportAttribute som standard avsökning av ett antal kataloger, inklusive den aktuella arbetskatalogen som biblioteket ska läsa in. Detta kan vara ett säkerhetsproblem för vissa program, vilket leder till DLL-kapning.
Om till exempel en skadlig DLL med samma namn som den importerade placeras under den aktuella arbetskatalogen, som först genomsöks som standard, kan den skadliga DLL-filen läsas in.
Mer information finns i Läsa in bibliotek på ett säkert sätt.
Så här åtgärdar du överträdelser
Använd DefaultDllImportSearchPathsAttribute för att uttryckligen ange sökvägen för DLL-sökvägen för sammansättningen eller metoden.
När du ska ignorera varningar
Det är säkert att ignorera den här regeln om:
- Du är säker på att den inlästa sammansättningen är det du vill ha. Ditt program körs till exempel på en betrodd server och du litar helt på filerna.
- Den importerade sammansättningen är en vanlig systemsammansättning, till exempel user32.dll, och sökvägsstrategin följer mekanismen Kända DLL:er.
Ignorera en varning
Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.
#pragma warning disable CA5392
// The code that's violating the rule is on this line.
#pragma warning restore CA5392
Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none
i konfigurationsfilen.
[*.{cs,vb}]
dotnet_diagnostic.CA5392.severity = none
Mer information finns i Så här utelämnar du kodanalysvarningar.
Exempel på pseudokod
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);
}
}
Lösning
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);
}
}