Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
| Egenskap | Värde |
|---|---|
| Regel-ID | CA5392 |
| Title | Använda attributet DefaultDllImportSearchPaths för P/Invokes |
| Kategori | Säkerhet |
| Korrigeringen är antingen invasiv eller icke-invasiv | Oumbrytbar |
| Aktiverad som standard i .NET 10 | Nej |
| Tillämpliga språk | C# och Visual Basic |
Orsak
DefaultDllImportSearchPathsAttribute är inte specificerad för en Platform Invoke (P/Invoke)-funktion.
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 Ladda bibliotek på ett säkert sätt.
Så här åtgärdar du överträdelser
Använd DefaultDllImportSearchPathsAttribute för att uttryckligen ange 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 assemblyn är den du avser. 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);
}
}