Sdílet prostřednictvím


CA2101: Určete kódování pro argumenty řetězce volání nespravovaného kódu

TypeName

SpecifyMarshalingForPInvokeStringArguments

CheckId

CA2101

Kategorie

Microsoft.Globalization

Narušující změna

Nenarušující

Příčina

Člen vyvolání platformy umožňuje částečně důvěryhodným volajícím mít řetězcový parametr a explicitně nezařazovat řetězec.

Popis pravidla

Při převodu ze standardu Unicode do ANSI je možné, že ne všechny znaky Unicode budou reprezentovány v konkrétní znakové stránce ANSI.Mapování nejlepší shody se snaží tento problém vyřešit nahrazením znaku, který nemůže být reprezentován, jiným znakem.Použití této funkce může způsobit potenciální chybu zabezpečení, protože nelze určit znak, který bude vybrán.Například škodlivý kód by mohl záměrně vytvořit Unicode řetězec obsahující znaky, které nejsou v určité znakové stránce, a ty budou následně převedeny na zvláštní znaky souborového systému jako ".." nebo "/".Všimněte si také bezpečnostní kontroly pro speciální znaky, ke které často dochází před převodem řetězce do ANSI.

Mapování nejlepší shody je výchozí postup pro nespravované převody, WChar na MByte.Ledaže by bylo mapování nejlepší shody explicitně vypnuto, pak v důsledku toho může kód obsahovat zneužitelnou bezpečnostní chybu.

Jak vyřešit porušení

Pro opravu porušení tohoto pravidla, je třeba explicitně zařazovat řetězce.

Kdy potlačit upozornění

Nepotlačujte upozornění na toto pravidlo.

Příklad

Následující příklad ukazuje postup, který porušuje toto pravidlo, a následně jak porušení vyřešit.

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);
    }
}