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 9 | 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