Поделиться через


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

TypeName

SpecifyMarshalingForPInvokeStringArguments

CheckId

CA2101

Категория

Microsoft.Globalization

Критическое изменение

Не критическое

Причина

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

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

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

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

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

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

Отключение предупреждений

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

Пример

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

using System;
using System.Runtime.InteropServices;
[assembly: System.Security.AllowPartiallyTrustedCallers()]

namespace SecurityLibrary
{
    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);
    }
}