次の方法で共有


CA5393: 安全でない DllImportSearchPath 値を使用しないでください

プロパティ
ルール ID CA5393
Title 安全でない DllImportSearchPath 値を使用しないでください
[カテゴリ] Security
修正が中断か中断なしであるか なし
.NET 8 では既定で有効 いいえ

原因

<xref:System.Runtime.InteropServices.DllImportSearchPath?displayProperty=fullName で次のいずれかの安全でない値を使用しています。

  • AssemblyDirectory
  • UseDllDirectoryForDependencies
  • ApplicationDirectory
  • LegacyBehavior

規則の説明

既定の DLL 検索ディレクトリとアセンブリ ディレクトリに悪意のある DLL が存在する可能性があります。 または、アプリケーションが実行されている場所に応じて、アプリケーションのディレクトリに悪意のある DLL が存在する可能性があります。

詳細については、ライブラリの安全な読み込みに関するページを参照してください。

違反の修正方法

代わりに DllImportSearchPath の値を使用して明示的な検索パスを指定します。

  • SafeDirectories
  • System32
  • UserDirectories

どのようなときに警告を抑制するか

次の場合は、この規則を抑制できます。

  • 読み込まれたアセンブリが必要なものだとわかっている。
  • インポートされたアセンブリが、user32.dll のような一般的に使用されるシステム アセンブリであり、検索パス戦略が Known DLLs メカニズムに従っている。

警告を抑制する

単一の違反を抑制するだけの場合は、ソース ファイルにプリプロセッサ ディレクティブを追加して無効にしてから、規則をもう一度有効にします。

#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 のどの値が分析に対して安全でないかを構成できます。 たとえば、コードで AssemblyDirectoryUseDllDirectoryForDependencies、または 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: P/Invoke に対して DefaultDllImportSearchPaths 属性を使用します