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.

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