共用方式為


CA2101:指定 P/Invoke 字串引數的封送處理

屬性
規則識別碼 CA2101
職稱 指定 P/Invoke 字串自變數的封送處理
類別 全球化
修正程式是中斷或非中斷 不中斷
預設在 .NET 9 中啟用 建議

原因

平臺調用成員允許部分信任的呼叫端、具有字串參數,而且不會明確封送處理字串。

檔案描述

當您從 Unicode 轉換成 ANSI 時,並非所有 Unicode 字元都可以在特定 ANSI 代碼頁中表示。 最適合的對應 會藉由取代無法表示的字元來嘗試解決此問題。 此功能的使用可能會導致潛在的安全性弱點,因為您無法控制所選的字元。 例如,惡意代碼可能會刻意建立 Unicode 字串,其中包含在特定代碼頁中找不到的字元,這些字元會轉換成文件系統特殊字元,例如 『.』。 或 『/』。 另請注意,在字串轉換成 ANSI 之前,經常發生特殊字元的安全性檢查。

最適合的對應是 Unmanaged 轉換的預設值,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