CA2101: Určete maršálování pro řetězcové argumenty volání P/Invoke

Vlastnost Hodnota
ID pravidla CA2101
Název Určení marshallingu pro P/Invoke argumenty řetězce
Kategorie Globalizace
Oprava, která může být destruktivní nebo nedestruktivní Nezlomitelný
Povoleno ve výchozím nastavení v .NET 10 Jako návrh
Příslušné jazyky C# a Visual Basic

Příčina

Člen vyvolání platformy povoluje volání částečně důvěryhodnými uživateli, má řetězcový parametr a neprovádí explicitní marshaling řetězce.

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. Nejvhodnější mapování se pokusí tento problém vyřešit nahrazením znaku, který nelze reprezentovat, jiným znakem. 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ů.

Nejvhodnější mapování je výchozí nastavení pro nespravovaný převod WChar na MByte. Pokud explicitně nezakážete mapování nejvhodnější shody, může váš kód tímto problémem obsahovat zneužitelnou zranitelnost 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ě zpracovávejte 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