CA2101: указание маршалинга для аргументов строки P/Invoke

Свойство Значение
Идентификатор правила CA2101
Заголовок Указание маршалинга для аргументов строки P/Invoke
Категория Глобализация
Исправление является критическим или не критическим Не критическое
Включен по умолчанию в .NET 9 Как предложение

Причина

Элемент вызова неуправляемого кода, разрешающий вызовы с частичным доверием, содержит строковый параметр и не выполняет явное маршалирование этой строки.

Описание правила

При преобразовании из Юникода в ANSI, возможно, не все символы Юникода могут быть представлены в определенной кодовой странице ANSI. Наилучшее сопоставление пытается решить эту проблему, заменяя символы, которые не могут быть представлены. Использование этой функции может привести к потенциальной уязвимости системы безопасности, поскольку вы не можете контролировать выбор символа. Например, вредоносный код может намеренно создать строку в Юникоде, содержащую символы, которых нет на определенной кодовой странице и которые преобразуются в специальные символы файловой системы, такие как ".." или "/". Проверки безопасности для специальных символов часто происходят перед преобразованием строки в ANSI.

Для неуправляемого преобразования по умолчанию, WChar в MByte, используется наилучшее соответствие. Если явно не отключить функцию наилучшего соответствия, код может содержать уязвимость системы безопасности, которую сможет использовать злоумышленник.

Внимание

Управление доступом для кода (CAS) не следует применять в качестве границы безопасности.

Устранение нарушений

Чтобы устранить нарушение этого правила, следует явно маршалировать строковые типы данных.

Когда лучше отключить предупреждения

Для этого правила отключать вывод предупреждений не следует.

Пример

В следующем примере показан метод, нарушающий это правило, а затем показано, как устранить нарушение.

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