CA2101: Określ marshalling dla argumentów ciągu P/Invoke
Właściwości | Wartość |
---|---|
Identyfikator reguły | CA2101 |
Tytuł | Określanie marshalingu dla argumentów ciągu P/Invoke |
Kategoria | Globalizacja |
Poprawka powodująca niezgodność lub niezgodność | Niezgodność |
Domyślnie włączone na platformie .NET 9 | Jako sugestia |
Przyczyna
Element członkowski wywołania platformy umożliwia częściowo zaufanym obiektom wywołującym, ma parametr ciągu i nie jawnie marshaluje ciągu.
Opis reguły
Podczas konwertowania z formatu Unicode na ANSI możliwe jest, że nie wszystkie znaki Unicode mogą być reprezentowane na określonej stronie kodowej ANSI. Mapowanie najlepszego dopasowania próbuje rozwiązać ten problem, podstawiając znak dla znaku, którego nie można przedstawić. Użycie tej funkcji może spowodować potencjalną lukę w zabezpieczeniach, ponieważ nie można kontrolować wybranego znaku. Na przykład złośliwy kod może celowo utworzyć ciąg Unicode zawierający znaki, które nie zostały znalezione na określonej stronie kodowej, która jest konwertowana na znaki specjalne systemu plików, takie jak "". lub "/". Należy również pamiętać, że sprawdzanie zabezpieczeń pod kątem znaków specjalnych często występuje przed przekonwertowanie ciągu na ANSI.
Mapowanie najlepszego dopasowania jest ustawieniem domyślnym dla niezarządzanej konwersji WChar na MByte. Jeśli nie wyłączysz jawnie mapowania najlepszego dopasowania, kod może zawierać lukę w zabezpieczeniach umożliwiającą wykorzystanie z powodu tego problemu.
Uwaga
Zabezpieczenia dostępu kodu (CAS) nie powinny być traktowane jako granica zabezpieczeń.
Jak naprawić naruszenia
Aby naprawić naruszenie tej reguły, jawnie marshaling typów danych ciągów.
Kiedy pomijać ostrzeżenia
Nie pomijaj ostrzeżeń dla tej reguły.
Przykład
W poniższym przykładzie przedstawiono metodę naruszającą tę regułę, a następnie pokazano, jak naprawić naruszenie.
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