CA2101: Especifique o empacotamento para argumentos de seqüência de caracteres de P/Invoke.
TypeName |
SpecifyMarshalingForPInvokeStringArguments |
CheckId |
CA2101 |
<strong>Categoria</strong> |
Microsoft.Globalization |
Alteração significativa |
Não-separável |
Causa
Uma plataforma chamar membro permite chamadores parcialmente confiáveis, tem um parâmetro de seqüência de caracteres e não é explicitamente empacotar a seqüência de caracteres.
Descrição da regra
Ao converter de Unicode para ANSI, é possível que nem todos os caracteres do Unicode podem ser representados em uma página de código ANSI específica. Mapeamento de ajuste perfeito tenta resolver esse problema substituindo um caractere para o caractere que não pode ser representado. O uso desse recurso pode causar uma vulnerabilidade de segurança potencial porque não é possível controlar o caractere que é escolhido. Por exemplo, o código mal-intencionado pode criar intencionalmente uma cadeia de caracteres Unicode contém caracteres que não são encontrados em uma página de código em particular, que são convertidos em caracteres especiais do sistema de arquivo como '..' ou '/'. Observe também que as verificações de segurança para caracteres especiais ocorrerem com freqüência antes da 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 desativa o 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 desta regra, empacotar 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);
}
}