共用方式為


CA2122:不要間接公開具有連結要求的方法

型別名稱

DoNotIndirectlyExposeMethodsWithLinkDemands

CheckId

CA2122

分類

Microsoft.Security

中斷變更

不中斷

原因

公用或保護的成員含有連結要求,而且是由未執行任何安全性檢查的成員所呼叫。

規則描述

連結要求只會檢查立即呼叫端的使用權限。 如果成員 X 沒有對呼叫端提出任何安全性要求,並呼叫連結要求所保護的程式碼,則不具所需權限的呼叫端即可使用 X 存取 protected 成員。

如何修正違規

將安全性資料存取和模型或連結要求加入至成員,以便讓它不再提供對連結要求的 protected 成員進行不安全存取。

隱藏警告的時機

若要放心地隱藏這項規則的警告,您必須確定程式碼不會授與呼叫端存取作業或資源的權限,因為這種存取權限可能會遭到惡意使用。

範例

下列範例會顯示違反規則的程式庫,以及示範程式庫弱點的應用程式。 範例程式庫所提供的這兩種方法都會違反規則。 EnvironmentSetting 方法會受到連結要求的保護,以防不限制地存取環境變數。 在呼叫 EnvironmentSetting 之前,DomainInformation 方法不會對其呼叫端提出任何安全性要求。

using System;
using System.IO;
using System.Security;
using System.Security.Permissions;

namespace SecurityRulesLibrary
{
   public class DoNotIndirectlyExposeMethodsWithLinkDemands
   {
      // Violates rule: DoNotIndirectlyExposeMethodsWithLinkDemands.
      public static string DomainInformation()
      {
         return EnvironmentSetting("USERDNSDOMAIN");
      }

      // Library method with link demand.
      // This method holds its immediate callers responsible for securing the information.
      // Because a caller must have unrestricted permission, the method asserts read permission
      // in case some caller in the stack does not have this permission. 

      [EnvironmentPermissionAttribute(SecurityAction.LinkDemand, Unrestricted=true)]
      public static string EnvironmentSetting(string environmentVariable)
      {
         EnvironmentPermission envPermission = new EnvironmentPermission( EnvironmentPermissionAccess.Read,environmentVariable);
         envPermission.Assert();

         return Environment.GetEnvironmentVariable(environmentVariable);
      }
   }
}

下列應用程式會呼叫不安全的程式庫成員。

using System;
using SecurityRulesLibrary;
using System.Security;
using System.Security.Permissions;

// You have no permission to access the sensitive information,
// but you will get data from the unprotected method.
[assembly:EnvironmentPermissionAttribute(
   SecurityAction.RequestRefuse,Unrestricted=true)]
namespace TestUnsecuredMembers
{
   class TestUnsecured
   {
      [STAThread]
      static void Main(string[] args)
      {
         string value = null;
         try 
         {
            value = DoNotIndirectlyExposeMethodsWithLinkDemands.DomainInformation();
         }
         catch (SecurityException e) 
         {
            Console.WriteLine(
               "Call to unsecured member was stopped by code access security! {0}",
               e.Message);
            throw;
         }
         if (value != null) 
         {
            Console.WriteLine("Value from unsecured member: {0}", value);
         }
      }
   }
}

這個範例會產生下列輸出。

  

請參閱

概念

安全程式碼撰寫方針

連結要求

其他資源

資料存取和模型