Dela via


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

Property Värde
Regel-ID CA5392
Rubrik Använda attributet DefaultDllImportSearchPaths för P/Invokes
Kategori Säkerhet
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 8 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äs in bibliotek Valv ly.

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

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