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

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

原因

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

檔案描述

當您從 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