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

Vlastnost Hodnota
ID pravidla CA2101
Název Určení zařazování pro argumenty řetězce volání nespravovaného kódu
Kategorie Globalizace
Oprava způsobující chybu nebo chybu způsobující chybu Nenarušující
Povoleno ve výchozím nastavení v .NET 8 Jako návrh

Příčina

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

Popis pravidla

Při převodu z Unicode na ANSI je možné, že ne všechny znaky Unicode mohou být reprezentovány na konkrétní znakovou stránku ANSI. Mapování, které nejlépe vyhovuje , se pokusí tento problém vyřešit nahrazením znaku znaku, který nelze reprezentovat. Použití této funkce může způsobit potenciální ohrožení zabezpečení, protože nemůžete řídit zvolený znak. Škodlivý kód může například úmyslně vytvořit řetězec Unicode, který obsahuje znaky, které nejsou nalezeny na konkrétní znakové stránce, které jsou převedeny na speciální znaky systému souborů, například ".". nebo /. Upozorňujeme také, že před převodem řetězce na ANSI často dochází k kontrolám zabezpečení speciálních znaků.

Mapování nejvhodnější je výchozí nastavení pro nespravovaný převod WChar na MByte. Pokud explicitně nezakážete mapování, může váš kód kvůli tomuto problému obsahovat zneužitelné ohrožení zabezpečení.

Upozornění

Zabezpečení přístupu kódu (CAS) by se nemělo považovat za hranice zabezpečení.

Jak opravit porušení

Chcete-li opravit porušení tohoto pravidla, explicitně zařazujte datové typy řetězců.

Kdy potlačit upozornění

Nepotlačujte upozornění na toto pravidlo.

Příklad

Následující příklad ukazuje metodu, která porušuje toto pravidlo, a poté ukazuje, jak opravit porušení.

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