共用方式為


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

型別名稱

SpecifyMarshalingForPInvokeStringArguments

CheckId

CA2101

分類

Microsoft.Globalization

中斷變更

中斷

原因

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

規則描述

從 Unicode 轉換為 ANSI 時,並非所有 Unicode 字元都可以用特定的 ANSI 字碼頁 (Code Page) 表示。 「自動調整對應」(Best-fit mapping) 會嘗試替換無法表示的字元以解決此問題。 使用此功能會導致潛在的安全性弱點,因為您無法控制所選擇的字元。 例如,惡意的程式碼會刻意建立包含特定字碼頁中找不到的字元之 Unicode 字串,這些字元會轉換為檔案系統的特殊字元,例如 '..' 或 '/'。 另請注意,在字串轉換為 ANSI 之前,會經常發生特殊字元的安全性檢查。

自動調整對應是 Unmanaged 轉換 (WChar 至 MByte) 的預設值。 除非您明確停用自動調整對應,否則您的程式碼會因為此問題而包含可被利用的安全性弱點。

如何修正違規

若要修正此規則的違規情形,請明確封送處理字串資料型別。

隱藏警告的時機

請勿隱藏此規則的警告。

範例

下列範例會顯示違反此規則的方法,然後顯示如何修正違規。

using System;
using System.Runtime.InteropServices;
[assembly: System.Security.AllowPartiallyTrustedCallers()]

namespace SecurityLibrary
{
    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);
    }
}