CS.SV.EXPOSED_FIELD

セキュリティ保護された型はフィールドを公開してはいけません。

リンク要求によってセキュア保護された型のインスタンスにコードがアクセスできる場合、コードは型のフィールドにアクセスするためにリンク要求を満たす必要はありません。

軽減と防止

この規則の違反を修正するには、フィールドを非 public にし、フィールドデータを返す public プロパティまたはメソッドを追加します。LinkDemand セキュリティチェックを型で行うことで、その型のプロパティとメソッドへのアクセスを保護します。ただし、コードアクセスセキュリティはフィールドには適用されません。

例 1

コピー
  using System;
  using System.Reflection;
  using System.Security;
  using System.Security.Permissions;
  
  namespace SecurityRulesLibrary
  {
     // This code requires immediate callers to have full trust.
    [System.Security.Permissions.PermissionSetAttribute(
        System.Security.Permissions.SecurityAction.LinkDemand, 
        Name="FullTrust")]
    public class SecuredTypeWithFields 
    {
       // Even though the type is secured, these fields are not. 
       // Violates rule: SecuredTypesShouldNotExposeFields. 
       public double xValue;
       public double yValue;
 
       public SecuredTypeWithFields (double x, double y) 
       {
          xValue = x;
          yValue = y;
          Console.WriteLine(
             "Creating an instance of SecuredTypeWithFields.");
       }
       public override string ToString()
       {
           return String.Format (
             "SecuredTypeWithFields {0} {1}", xValue, yValue);
       }
    }
 }

この例は、セキュリティ保護されていないフィールドを伴うライブラリ型 (SecuredTypeWithFields)、ライブラリ型のインスタンスを作成できて、インスタンスを作成する許可がない型に誤ってインスタンスを渡す型 (Distributor)、および型のセキュリティ保護の許可がなくてもインスタンスのフィールドを読み取ることができるアプリケーションコードで構成されています。後に続くライブラリコードは規則に違反しています。

例 2

コピー
  using System;
  using System.Reflection;
  using System.Security;
  using System.Security.Permissions;
  
  // This assembly executes with full trust.  
  
  namespace SecurityRulesLibrary
 {
    // This type creates and returns instances of the secured type. 
    // The GetAnInstance method incorrectly gives the instance  
    // to a type that does not have the link demanded permission. 
 
    public class Distributor
    {
       static SecuredTypeWithFields s = new SecuredTypeWithFields(22,33);
       public static SecuredTypeWithFields GetAnInstance ()
       {
             return s;
       }
 
       public static void DisplayCachedObject ()
       {
          Console.WriteLine(
             "Cached Object fields: {0}, {1}", s.xValue , s.yValue);
       }
    }
 }

セキュリティ保護された型を保護するリンク要求のため、アプリケーションはインスタンスを作成できません。次のクラスにより、アプリケーションはセキュリティ保護された型のインスタンスを取得できるようになります。

例 3

コピー
  using System;
  using System.Security;
  using System.Security.Permissions;
  using SecurityRulesLibrary;
  
  // This code executes with partial trust.
  [assembly: System.Security.Permissions.PermissionSetAttribute(
     System.Security.Permissions.SecurityAction.RequestRefuse,
    Name = "FullTrust")]
 namespace TestSecurityExamples
 {
     public class TestLinkDemandOnField
     {
         [STAThread]
         public static void Main()
         {
             // Get an instance of the protected object.
             SecuredTypeWithFields secureType = Distributor.GetAnInstance();
 
             // Even though this type does not have full trust, 
             // it can directly access the secured type's fields.
             Console.WriteLine(
                "Secured type fields: {0}, {1}",
                secureType.xValue,
                secureType.yValue);
             Console.WriteLine("Changing secured type's field...");
             secureType.xValue = 99;
 
             // Distributor must call ToString on the secured object.
             Distributor.DisplayCachedObject();
 
             // If the following line is uncommented, a security  
             // exception is thrown at JIT-compilation time because  
             // of the link demand for full trust that protects  
             // SecuredTypeWithFields.ToString(). 
 
             // Console.WriteLine("Secured type {0}",secureType.ToString());
         }
     }
 }

アプリケーションは、セキュリティ保護された型のメソッドにアクセスする許可がなくても、コードがそのフィールドにアクセスできる方法を示しています。