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