Compartilhar via


Especifique o marshaling para argumentos de seqüência de caracteres de P/Invoke

TypeName

SpecifyMarshalingForPInvokeStringArguments

CheckId

CA2101

Category (Categoria)

Microsoft.globalização

Quebrando alterar

Não-separáveis

Causa

Invocação de uma plataforma membro permite aos chamadores parcialmente confiável, tem um parâmetro de seqüência de caracteres e não realizar realizar marshaling explicitamente a seqüência de caracteres.

Descrição da regra

Ao converter Unicode em ANSI, é possível que nem todos os caracteres Unicode podem ser representados em uma página de código ANSI específica.Mapeamento de melhor ajuste tenta para resolver esse problema substituindo um caractere para o caractere que não pode ser representado.O uso desse recurso pode causar uma possível vulnerabilidade de segurança porque não é possível controlar o caractere que é escolhido.Por exemplo, um código mal-intencionado intencionalmente poderia criar uma seqüência de caracteres Unicode que contém caracteres não encontrados em uma página de código em particular, que são convertidos em caracteres especiais do arquivo de sistema, sistema autônomo '' ou '/'.Observe também que verificações de segurança para caracteres especiais ocorrem com freqüência antes que a seqüência de caracteres é convertida em ANSI.

Mapeamento de ajuste perfeito é o padrão para a conversão não gerenciado, WChar para MByte.A menos que você explicitamente desabilitar mapeamento de melhor ajuste, seu código pode conter uma vulnerabilidade de segurança pode ser explorada por causa do problema.

Como corrigir violações

Para corrigir uma violação dessa regra, realizar realizar marshaling explicitamente os tipos de dados de seqüência de caracteres.

Quando suprimir avisos

Não suprimir um aviso da regra.

Exemplo

O exemplo a seguir mostra um método que viola essa regra e, em seguida, 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);
    }
}