Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
| 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