CA2140: 透過的コードは、セキュリティ上重要な項目を参照してはならない
TypeName |
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();
}
}
}