CA2151:具有關鍵類型的欄位應為安全性關鍵
TypeName |
|
CheckId |
CA2151 |
分類 |
Microsoft.Security |
中斷變更 |
中斷 |
原因
已宣告安全性透明欄位或安全性關鍵欄位。它的指定類型為安全性關鍵類型。例如:
[assembly: AllowPartiallyTrustedCallers]
[SecurityCritical]
class Type1 { } // Security Critical type
class Type2 // Security transparent type
{
Type1 m_field; // CA2151, transparent field of critical type
}
在此範例中,m_field 是屬於安全性關鍵類型的安全性透明欄位。
規則描述
若要使用安全性關鍵類型,參考該類型的程式碼必須是安全性關鍵或安全性安全關鍵。即使是間接參考也是如此。例如,當您參考屬於關鍵類型的透明欄位時,您的程式碼必須是安全性關鍵或安全性安全。因此,使用安全性透明或安全性安全關鍵欄位容易發生錯誤,因為透明程式碼仍然無法存取該欄位。
如何修正違規
若要修正此規則的違規情形,請標示具有 SecurityCriticalAttribute 屬性的欄位,或是將該欄位所參考的類型設為安全性透明或安全性關鍵類型。
// Fix 1: Make the referencing field security critical
[assembly: AllowPartiallyTrustedCallers]
[SecurityCritical]
class Type1 { } // Security Critical type
class Type2 // Security transparent type
{
[SecurityCritical]
Type1 m_field; // Fixed: critical type, critical field
}
// Fix 2: Make the referencing field security critical
[assembly: AllowPartiallyTrustedCallers]
class Type1 { } // Type1 is now transparent
class Type2 // Security transparent type
{
[SecurityCritical]
Type1 m_field; // Fixed: critical type, critical field
}
隱藏警告的時機
請勿隱藏此規則的警告。
程式碼
using System;
using System.Runtime.InteropServices;
using System.Security;
namespace TransparencyWarningsDemo
{
public class SafeNativeMethods
{
// CA2145 violation - transparent method marked SuppressUnmanagedCodeSecurity. This should be fixed by
// marking this method SecurityCritical.
[DllImport("kernel32.dll", SetLastError = true)]
[SuppressUnmanagedCodeSecurity]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool Beep(uint dwFreq, uint dwDuration);
}
}