CA5392: Usar o atributo DefaultDllImportSearchPaths para P/Invokes
Property | Valor |
---|---|
ID da regra | CA5392 |
Título | Usar o atributo DefaultDllImportSearchPaths para P/Invokes |
Categoria | Segurança |
Correção interruptiva ou sem interrupção | Sem interrupção |
Habilitado por padrão no .NET 9 | Não |
Causa
A função DefaultDllImportSearchPathsAttribute não é especificada para uma função de invocação de plataforma (P/Invoke).
Descrição da regra
Por padrão, as funções P/Invoke que usam DllImportAttribute investigam vários diretórios, incluindo o diretório de trabalho atual da biblioteca a ser carregada. 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 que a 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 de 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ê deseja. 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
Para suprimir apenas uma violação, adicione diretivas de pré-processador ao arquivo de origem a fim de desabilitar e, em seguida, reabilitar 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 em um arquivo, uma pasta ou um projeto, defina a severidade como none
no arquivo de configuração.
[*.{cs,vb}]
dotnet_diagnostic.CA5392.severity = none
Para obter mais informações, confira 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);
}
}