CA2101: Especificar empacotamento para argumentos de cadeia de caracteres P/Invoke
Property | valor |
---|---|
ID da regra | CA2101 |
Título | Especificar empacotamento para argumentos de cadeia de caracteres P/Invoke |
Categoria | Globalização |
A correção está quebrando ou não quebrando | Sem quebra |
Habilitado por padrão no .NET 8 | Como sugestão |
Motivo
Um membro de invocação de plataforma permite chamadores parcialmente confiáveis, tem um parâmetro string e não empacota explicitamente a string.
Descrição da regra
Quando você converte de Unicode para ANSI, é possível que nem todos os caracteres Unicode possam ser representados em uma página de código ANSI específica. O mapeamento mais adequado tenta resolver esse problema substituindo um caractere pelo caractere que não pode ser representado. O uso desse recurso pode causar uma vulnerabilidade de segurança potencial porque você não pode controlar o caractere escolhido. Por exemplo, um código mal-intencionado pode criar intencionalmente uma cadeia de caracteres Unicode que contém caracteres que não são encontrados em uma página de código específica, que são convertidos em caracteres especiais do sistema de arquivos, como '..' ou «/». Observe também que as verificações de segurança para caracteres especiais ocorrem com freqüência antes que a cadeia de caracteres seja convertida em ANSI.
O mapeamento de melhor ajuste é o padrão para a conversão não gerenciada, WChar para MByte. A menos que você desabilite explicitamente o mapeamento de melhor ajuste, seu código pode conter uma vulnerabilidade de segurança explorável devido a esse problema.
Atenção
A Segurança de Acesso ao Código (CAS) não deve ser considerada um limite de segurança.
Como corrigir violações
Para corrigir uma violação dessa regra, marshal explicitamente tipos de dados de cadeia de caracteres.
Quando suprimir avisos
Não suprima um aviso desta regra.
Exemplo
O exemplo a seguir mostra um método que viola essa regra e, em seguida, mostra como corrigir a violação.
class NativeMethods
{
// Violates rule: SpecifyMarshalingForPInvokeStringArguments.
[DllImport("advapi32.dll", CharSet = CharSet.Auto)]
internal static extern int RegCreateKey(IntPtr key, String subKey, out IntPtr result);
// Satisfies rule: SpecifyMarshalingForPInvokeStringArguments.
[DllImport("advapi32.dll", CharSet = CharSet.Unicode)]
internal static extern int RegCreateKey2(IntPtr key, String subKey, out IntPtr result);
}
Friend Class NativeMethods
' Violates rule: SpecifyMarshalingForPInvokeStringArguments.
<DllImport("advapi32.dll", CharSet:=CharSet.Auto)>
Friend Shared Function RegCreateKey(ByVal key As IntPtr, ByVal subKey As String, <Out> ByRef result As IntPtr) As Integer
End Function
' Satisfies rule: SpecifyMarshalingForPInvokeStringArguments.
<DllImport("advapi32.dll", CharSet:=CharSet.Unicode)>
Friend Shared Function RegCreateKey2(ByVal key As IntPtr, ByVal subKey As String, <Out> ByRef result As IntPtr) As Integer
End Function
End Class