Бөлісу құралы:


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

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

Причина

Член platform invoke, который допускает вызовы с частичным доверием, имеет строковый параметр и не выполняет явное управление этой строкой.

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

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

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

Внимание

Code Access Security (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