Condividi tramite


CA5392: Usare l'attributo DefaultDllImportSearchPaths per le chiamate P/Invoke

Proprietà valore
ID regola CA5392
Title Usare l'attributo DefaultDllImportSearchPaths per P/Invoke
Categoria Sicurezza
La correzione causa un'interruzione o meno Non rompente
Abilitato per impostazione predefinita in .NET 10 No
Linguaggi applicabili C# e Visual Basic

Causa

Il DefaultDllImportSearchPathsAttribute non è specificato per una funzione Platform Invoke (P/Invoke).

Descrizione regola

Per impostazione predefinita, le funzioni P/Invoke verificano una serie di directory, inclusa la directory di lavoro corrente, per caricare la libreria. Può rappresentare un problema di sicurezza per determinate applicazioni, portando all'hijacking della DLL.

Ad esempio, se una DLL dannosa con lo stesso nome di quella importata viene inserita nella directory di lavoro corrente, che verrà cercata per prima per impostazione predefinita, la DLL dannosa potrebbe essere caricata.

Per altre informazioni, vedere Caricare la libreria in modo sicuro.

Come correggere le violazioni

Usare DefaultDllImportSearchPathsAttribute per specificare esplicitamente il percorso di ricerca DLL per l'assembly o il metodo.

Quando eliminare gli avvisi

È possibile eliminare questa regola in modo sicuro se:

  • Si è certi che l'assembly caricato sia quello desiderato. Ad esempio, l'applicazione viene eseguita in un server attendibile e si considerano completamente attendibili i file.
  • L'assembly importato è un assembly di sistema comunemente usato, ad esempio user32.dll, e la strategia del percorso di ricerca segue il meccanismo delle DLL conosciute.

Eliminare un avviso

Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.

#pragma warning disable CA5392
// The code that's violating the rule is on this line.
#pragma warning restore CA5392

Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità none su nel file di configurazione.

[*.{cs,vb}]
dotnet_diagnostic.CA5392.severity = none

Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.

Esempi di pseudo-codice

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

Soluzione

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: Non usare il valore DllImportSearchPath non sicuro