Partilhar via


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

TypeName

SpecifyMarshalingForPInvokeStringArguments

CheckId

CA2101

Categoria

Microsoft.Globalization

Alteração Significativa

Sem quebra

Causa

Um membro da invocação de plataforma permitir chamadores parcialmente confiáveis, tem um parâmetro de cadeia de caracteres, e não faz explicitamente para realizar marshaling a cadeia de caracteres.

Descrição da Regra

Ao converter de Unicode para ANSI, é possível que nem todos os caracteres Unicode podem ser representados em uma página de código ANSI específica.o mapeamento de melhor ajuste tenta resolver esse problema substituindo um caractere por 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 que é escolhido.Por exemplo, o código mal-intencionado pode intencionalmente criar uma cadeia de caracteres Unicode que contém os caracteres que não são encontrados em uma página de código específico, que são convertidos em caracteres especiais do sistema de arquivos como “.” ou “/”.Observe também que as verificações de segurança de caracteres especiais ocorrem frequentemente antes que a cadeia de caracteres é convertida em ANSI.

o mapeamento de melhor ajuste é o padrão para a conversão não gerenciado, WChar ao MByte.A menos que você desabilitasse 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 desta regra, explicitamente tipos de dados de cadeia de caracteres de marshaling.

Quando Suprimir Alertas

Não elimine um alerta desta regra.

Exemplo

O exemplo a seguir mostra um método que viola essa regra, e depois mostra como corrigir a violação.

using System;
using System.Runtime.InteropServices;
[assembly: System.Security.AllowPartiallyTrustedCallers()]

namespace SecurityLibrary
{
    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);
    }
}