CA2101:指定对 P/Invoke 字符串参数进行封送处理

属性
规则 ID CA2101
标题 指定对 P/Invoke 字符串参数进行封送处理
类别 全球化
修复是中断修复还是非中断修复 非中断
在 .NET 8 中默认启用 作为建议

原因

某平台调用成员允许部分受信任的调用方,具有一个字符串参数,并且不显式封送该字符串。

规则说明

从 Unicode 转换为 ANSI 时,可能并非所有 Unicode 字符都可在特定 ANSI 代码页中表示。 最佳映射尝试用某个字符替换不能表示的字符来解决这个问题。 使用此功能可能会导致潜在的安全漏洞,因为你无法控制所选的字符。 例如,恶意代码可能会有意创建一个 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