CA5392:对 P/Invoke 使用 DefaultDllImportSearchPaths 属性
属性 | 值 |
---|---|
规则 ID | CA5392 |
标题 | 对 P/Invoke 使用 DefaultDllImportSearchPaths 属性 |
类别 | 安全性 |
修复是中断修复还是非中断修复 | 非中断 |
在 .NET 8 中默认启用 | 否 |
原因
没有为平台调用 (P/Invoke) 函数指定 DefaultDllImportSearchPathsAttribute。
规则说明
默认情况下,使用 DllImportAttribute 的 P/Invoke 函数会探测大量目录,包括要加载的库的当前工作目录。 这对于某些应用程序来说是一个安全隐患,会导致 DLL 劫持。
例如,如果将与导入的 DLL 同名的恶意 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);
}
}