CA5392: использование атрибута DefaultDllImportSearchPaths для P/Invokes

Свойство Значение
Идентификатор правила CA5392
Заголовок используйте атрибут DefaultDllImportSearchPaths для методов P/Invoke
Категория Безопасность
Исправление является критическим или не критическим Не критическое
Включен по умолчанию в .NET 8 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