Укажите тип маршалинга для строковых аргументов P/Invoke
Обновлен: Ноябрь 2007
TypeName |
SpecifyMarshalingForPInvokeStringArguments |
CheckId |
CA2101 |
Категория |
Microsoft.Globalization |
Критическое изменение |
NonBreaking |
Причина
Член вызова неуправляемого кода, разрешающий вызовы с частичным доверием, содержит строковый параметр и не выполняет явный маршалинг и преобразование этой строки.
Описание правила
При преобразовании знаков Юникода в кодировку 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);
}
}