CA2101: P/Invoke 文字列引数に対してマーシャリングを指定します

プロパティ
ルール ID CA2101
Title P/Invoke 文字列引数に対してマーシャリングを指定します
[カテゴリ] グローバリゼーション
修正が中断ありか中断なしか なし
.NET 8 では既定で有効 提案として

原因

プラットフォーム呼び出しメンバーが、部分信頼の呼び出し元を許可し、文字列パラメーターを持ち、さらにその文字列を明示的にマーシャリングしていません。

規則の説明

Unicode から ANSI に変換する場合、特定の ANSI コード ページで、すべての Unicode 文字を表現できない可能性があります。 最適マッピングでは、表現できない文字を、ある文字に置き換えることで、この問題を解決しようとします。 この機能を使用すると、選択した文字を制御できなくなるため、セキュリティ上の脆弱性が生じる可能性があります。 たとえば、悪意のあるコードで、特定のコード ページに見つからない文字 (これは ".." または "/" などのファイル システムの特殊文字に変換されます) を含む Unicode 文字列を意図的に作成することができます。 また、多くの場合、文字列が ANSI に変換される前に特殊文字のセキュリティ チェックが行われることにも注意してください。

最適マッピングは、アンマネージド変換 (WChar から MByte) の既定値です。 最適マッピングを明示的に無効にしない限り、コードには、この問題のために、悪用可能なセキュリティ上の脆弱性が含まれている可能性があります。

注意事項

コード アクセス セキュリティ (CAS) をセキュリティ境界と見なさないでください。

違反の修正方法

この規則違反を修正するには、文字列データ型を明示的にマーシャリングします。

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

この規則による警告は抑制しないでください。

次の例では、この規則に違反するメソッドを示し、その違反の修正方法を示しています。

class NativeMethods
{
    // Violates rule: SpecifyMarshalingForPInvokeStringArguments.
    [DllImport("advapi32.dll", CharSet = CharSet.Auto)]
    internal static extern int RegCreateKey(IntPtr key, String subKey, out IntPtr result);

    // Satisfies rule: SpecifyMarshalingForPInvokeStringArguments.
    [DllImport("advapi32.dll", CharSet = CharSet.Unicode)]
    internal static extern int RegCreateKey2(IntPtr key, String subKey, out IntPtr result);
}
Friend Class NativeMethods
    ' Violates rule: SpecifyMarshalingForPInvokeStringArguments.
    <DllImport("advapi32.dll", CharSet:=CharSet.Auto)>
    Friend Shared Function RegCreateKey(ByVal key As IntPtr, ByVal subKey As String, <Out> ByRef result As IntPtr) As Integer
    End Function

    ' Satisfies rule: SpecifyMarshalingForPInvokeStringArguments.
    <DllImport("advapi32.dll", CharSet:=CharSet.Unicode)>
    Friend Shared Function RegCreateKey2(ByVal key As IntPtr, ByVal subKey As String, <Out> ByRef result As IntPtr) As Integer
    End Function
End Class