Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
| Свойство | Значение |
|---|---|
| Идентификатор правила | 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