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