共用方式為


CA5122 P/Invoke 宣告不可為安全關鍵

TypeName

PInvokesShouldNotBeSafeCriticalFxCopRule

CheckId

CA5122

分類

Microsoft.Security

中斷變更

中斷

原因

P/Invoke 宣告已用 SecuritySafeCriticalAttribute標記:

[assembly: AllowPartiallyTrustedCallers]

// ...
public class C
{
    [SecuritySafeCritical]
    [DllImport("kernel32.dll")]
    public static extern bool Beep(int frequency, int duration); // CA5122 – safe critical p/invoke
   }

在此範例中,C.Beep(...) 已標記為安全性安全關鍵方法。

規則描述

在執行安全性敏感作業時,會將方法標記為 SecuritySafeCritical,但透明程式碼也能安全地使用。安全性透明度模型的基本規則之一是透明程式碼不可直接透過 P/Invoke 呼叫機器碼。因此,即使將 P/Invoke 標示為安全性安全關鍵,透明程式碼仍然不能呼叫它,而且會導致安全性分析錯誤。

如何修正違規

若要讓透明程式碼可以使用 P/Invoke,須公開安全性安全關鍵包裝函式方法:

[assembly: AllowPartiallyTrustedCallers

class C
{
   [SecurityCritical]
   [DllImport(“kernel32.dll”, EntryPoint=”Beep”)]
   private static extern bool BeepPinvoke(int frequency, int duration); // Security Critical P/Invoke

   [SecuritySafeCritical]
   public static bool Beep(int frequency, int duration)
   {
      return BeepPInvoke(frequency, duration);
   }
}

隱藏警告的時機

請勿隱藏此規則的警告。