CA2140:透明程式碼不可以參考安全性關鍵項目
型別名稱 |
TransparentMethodsMustNotReferenceCriticalCode |
CheckId |
CA2140 |
分類 |
Microsoft.Security |
中斷變更 |
中斷 |
原因
透明方法:
處理安全性關鍵的安全性例外狀況型別
具有標示為安全性關鍵型別的參數
具有含安全性關鍵條件約束的泛型參數
具有安全性關鍵型別的區域變數
參考標示為安全性關鍵的型別
呼叫標記為安全性關鍵的方法
參考標示為安全性關鍵的欄位
傳回標示為安全性關鍵的型別
規則描述
標示 SecurityCriticalAttribute 屬性的程式碼項目具安全性關鍵。 透明方法不能使用安全性關鍵項目。 如果透明型別嘗試使用安全性關鍵型別,就會引發 TypeAccessException、MethodAccessException 或 FieldAccessException。
如何修正違規
若要修正此規則的違規情形,請執行下列其中一項:
將使用安全性關鍵程式碼的程式碼項目標記 SecurityCriticalAttribute 屬性
-或-
從標記為安全性關鍵的程式碼項目中移除 SecurityCriticalAttribute 屬性,改將其標記為 SecuritySafeCriticalAttribute 或 SecurityTransparentAttribute 屬性。
隱藏警告的時機
請勿隱藏此規則的警告。
範例
在下列範例中,透明方法會嘗試參考安全性關鍵泛型集合、安全性關鍵欄位,以及安全性關鍵方法。
using System;
using System.Security;
using System.Collections.Generic;
namespace TransparencyWarningsDemo
{
[SecurityCritical]
public class SecurityCriticalClass { }
public class TransparentMethodsReferenceCriticalCodeClass
{
[SecurityCritical]
private object m_criticalField;
[SecurityCritical]
private void CriticalMethod() { }
public void TransparentMethod()
{
// CA2140 violation - transparent method accessing a critical type. This can be fixed by any of:
// 1. Make TransparentMethod critical
// 2. Make TransparentMethod safe critical
// 3. Make CriticalClass safe critical
// 4. Make CriticalClass transparent
List<SecurityCriticalClass> l = new List<SecurityCriticalClass>();
// CA2140 violation - transparent method accessing a critical field. This can be fixed by any of:
// 1. Make TransparentMethod critical
// 2. Make TransparentMethod safe critical
// 3. Make m_criticalField safe critical
// 4. Make m_criticalField transparent
m_criticalField = l;
// CA2140 violation - transparent method accessing a critical method. This can be fixed by any of:
// 1. Make TransparentMethod critical
// 2. Make TransparentMethod safe critical
// 3. Make CriticalMethod safe critical
// 4. Make CriticalMethod transparent
CriticalMethod();
}
}
}