Compartilhar via


CA2101: especificar marshaling para argumentos de cadeia de caracteres P/Invoke

Property Valor
ID da regra CA2101
Título Especificar o marshalling para argumentos de cadeia de caracteres P/Invoke
Categoria Globalização
Correção interruptiva ou sem interrupção Sem interrupção
Habilitado por padrão no .NET 9 Como sugestão

Causa

Um membro de invocação da plataforma permite chamadores parcialmente confiáveis, tem um parâmetro de cadeia de caracteres e não realiza marshaling da cadeia de caracteres explicitamente.

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 de melhor ajuste tenta resolver esse problema substituindo um caractere pelo caractere que não pode ser representado. O uso desse recurso pode causar uma possível vulnerabilidade de segurança porque você não pode controlar o caractere escolhido. Por exemplo, o código mal-intencionado poderia 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 frequê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.

Cuidado

A Segurança de Acesso do Código (CAS) não deve ser considerada como um limite de segurança.

Como corrigir violações

Para corrigir uma violação dessa regra, realize marshal explicitamente de tipos de dados de cadeia de caracteres.

Quando suprimir avisos

Não suprima um aviso nessa regra.

Exemplo

O exemplo a seguir mostra um método que viola essa regra e 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