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