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