Partilhar via


CA5392: Usar o atributo DefaultDllImportSearchPaths para P/Invokes

Propriedade valor
ID da regra CA5392
Cargo Use o atributo DefaultDllImportSearchPaths para P/Invokes
Categoria Segurança
A correção está quebrando ou não quebrando Sem quebra
Habilitado por padrão no .NET 8 Não

Causa

O DefaultDllImportSearchPathsAttribute não é especificado para uma função Platform Invoke (P/Invoke).

Descrição da regra

Por padrão, P/Invoke funciona usando DllImportAttribute sondar vários diretórios, incluindo o diretório de trabalho atual para a biblioteca carregar. Isso pode ser um problema de segurança para determinados aplicativos, levando ao sequestro de DLL.

Por exemplo, se uma DLL mal-intencionada com o mesmo nome da importada for colocada no diretório de trabalho atual, que será pesquisado primeiro por padrão, a DLL mal-intencionada poderá ser carregada.

Para obter mais informações, consulte Carregar biblioteca com segurança.

Como corrigir violações

Use DefaultDllImportSearchPathsAttribute para especificar o caminho de pesquisa DLL explicitamente para o assembly ou o método.

Quando suprimir avisos

É seguro suprimir esta regra se:

  • Você tem certeza de que o assembly carregado é o que você quer. Por exemplo, seu aplicativo é executado em um servidor confiável e você confia completamente nos arquivos.
  • O assembly importado é um assembly de sistema comumente usado, como user32.dll, e a estratégia de caminho de pesquisa segue o mecanismo de DLLs conhecidas.

Suprimir um aviso

Se você quiser apenas suprimir uma única violação, adicione diretivas de pré-processador ao seu arquivo de origem para desativar e, em seguida, reativar a regra.

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

Para desabilitar a regra de um arquivo, pasta ou projeto, defina sua gravidade como none no arquivo de configuração.

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

Para obter mais informações, consulte Como suprimir avisos de análise de código.

Exemplos de pseudocódigo

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

Solução

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: Não use o valor DllImportSearchPath não seguro