Поделиться через


CA5393: не используйте небезопасное значение DllImportSearchPath

Свойство Значение
Идентификатор правила CA5393
Заголовок не используйте небезопасное значение DllImportSearchPath
Категория Безопасность
Исправление является критическим или не критическим Не критическое
Включен по умолчанию в .NET 8 No

Причина

Использование одного из небезопасных значений <xref:System.Runtime.InteropServices.DllImportSearchPath?displayProperty=fullName:

  • AssemblyDirectory
  • UseDllDirectoryForDependencies
  • ApplicationDirectory
  • LegacyBehavior

Описание правила

В каталогах поиска DLL по умолчанию и каталогах сборок может находиться вредоносная библиотека DLL. Или в зависимости от того, откуда запускается приложение, в каталоге приложения может быть вредоносная библиотека DLL.

Дополнительные сведения см. в разделе Безопасная загрузка библиотеки.

Устранение нарушений

Используйте безопасные DllImportSearchPath значения для указания явного пути поиска.

  • SafeDirectories
  • System32
  • UserDirectories

Когда лучше отключить предупреждения

Это правило можно безопасно отключить в следующих случаях.

  • Вы уверены, что загруженная сборка — это то, что вам нужно.
  • Импортированная сборка является часто используемой системной сборкой, такой как user32.dll, а стратегия пути поиска использует механизм известных библиотек DLL.

Отключение предупреждений

Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.

#pragma warning disable CA5393
// The code that's violating the rule is on this line.
#pragma warning restore CA5393

Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none в файле конфигурации.

[*.{cs,vb}]
dotnet_diagnostic.CA5393.severity = none

Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.

Настройка кода для анализа

Используйте следующий параметр, чтобы выбрать части базы кода для применения этого правила.

Этот параметр можно настроить только для этого правила, для всех правил, к которым он применяется, или для всех правил в этой категории (безопасности), к которым она применяется. Дополнительные сведения см. в статье Параметры конфигурации правила качества кода.

Небезопасные биты DllImportSearchPath

Для анализа вы можете указать, какое значение DllImportSearchPath является небезопасным. Например, чтобы указать, что правило не должно использовать AssemblyDirectory, UseDllDirectoryForDependencies или ApplicationDirectory, добавьте следующую пару "ключ-значение" в файл .editorconfig в своем проекте:

dotnet_code_quality.CA5393.unsafe_DllImportSearchPath_bits = 770

Следует указывать целочисленное значение побитового сочетания значений перечисления.

Примеры псевдокода

using System;
using System.Runtime.InteropServices;

class ExampleClass
{
    [DllImport("The3rdAssembly.dll")]
    [DefaultDllImportSearchPaths(DllImportSearchPath.AssemblyDirectory)]
    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);
    }
}

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