CA5392: использование атрибута DefaultDllImportSearchPaths для P/Invokes
Свойство | Значение |
---|---|
Идентификатор правила | CA5392 |
Заголовок | используйте атрибут DefaultDllImportSearchPaths для методов P/Invoke |
Категория | Безопасность |
Исправление является критическим или не критическим | Не критическое |
Включен по умолчанию в .NET 9 | No |
Причина
Атрибут DefaultDllImportSearchPathsAttribute не указан для функции вызова неуправляемого кода (P/Invoke).
Описание правила
По умолчанию функции P/Invoke используют пробу DllImportAttribute нескольких каталогов, включая текущий рабочий каталог для загрузки библиотеки. Это может быть проблемой безопасности для некоторых приложений, приводящей к перехвату библиотеки DLL.
Например, если вредоносная библиотека DLL с тем же именем, что и у импортированной, помещена в текущий рабочий каталог, в котором по умолчанию в первую очередь будет выполняться поиск, то может быть загружена именно она.
Дополнительные сведения см. в разделе Безопасная загрузка библиотеки.
Устранение нарушений
Используйте атрибут DefaultDllImportSearchPathsAttribute, чтобы явным образом указать пути поиска DLL для сборки или метода.
Когда лучше отключить предупреждения
Это правило можно безопасно отключить в следующих случаях.
- Вы уверены, что загруженная сборка — это то, что вам нужно. Например, приложение выполняется на доверенном сервере, и вы полностью доверяете файлам.
- Импортированная сборка является часто используемой системной сборкой, такой как user32.dll, а стратегия пути поиска использует механизм известных библиотек DLL.
Отключение предупреждений
Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.
#pragma warning disable CA5392
// The code that's violating the rule is on this line.
#pragma warning restore CA5392
Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none
в файле конфигурации.
[*.{cs,vb}]
dotnet_diagnostic.CA5392.severity = none
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.
Примеры псевдокода
using System;
using System.Runtime.InteropServices;
class ExampleClass
{
[DllImport("The3rdAssembly.dll")]
public static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type);
public void ExampleMethod()
{
MessageBox(new IntPtr(0), "Hello World!", "Hello Dialog", 0);
}
}
Решение
using System;
using System.Runtime.InteropServices;
class ExampleClass
{
[DllImport("The3rdAssembly.dll")]
[DefaultDllImportSearchPaths(DllImportSearchPath.UserDirectories)]
public static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type);
public void ExampleMethod()
{
MessageBox(new IntPtr(0), "Hello World!", "Hello Dialog", 0);
}
}
Связанные правила
CA5393: не используйте небезопасное значение DllImportSearchPath