CA2101:指定对 P/Invoke 字符串参数进行封送处理
属性 | 值 |
---|---|
规则 ID | CA2101 |
标题 | 指定对 P/Invoke 字符串参数进行封送处理 |
类别 | 全球化 |
修复是中断修复还是非中断修复 | 非中断 |
在 .NET 9 中默认启用 | 作为建议 |
原因
某平台调用成员允许部分受信任的调用方,具有一个字符串参数,并且不显式封送该字符串。
规则说明
从 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