CA5392: Använd attributet DefaultDllImportSearchPaths för P/Invokes

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);
    }
}

CA5393: Använd inte osäkert DllImportSearchPath-värde