首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

CLR 4.0 透明度模型:APTCA 組件遷移指南

     編輯:關於.NET

.NET Framework 4 引入 Level 2 透明度模型(與 Silverlight 相同),大幅改變 AllowPartiallyTrustedCallers (APTCA) 組件的安全性語意。本文詳細說明遷移所需的屬性標記與工具輔助。

v2/v3.5 (Level 1) APTCA 行為

  • 強名稱組件預設受 隱性 LinkDemand (FullTrust) 保護,部分信任程式碼無法呼叫。
  • 加上 [assembly: AllowPartiallyTrustedCallers] 移除 LinkDemand,允許部分信任呼叫者存取。
  • 作者責任:以 顯性 LinkDemand 或 完整要求 保護危險操作。

v4 (Level 2) 透明度模型核心變更

  • 移除隱性 LinkDemand;改以 透明度屬性 控管存取。
  • 預設規則:完全信任組件 = SecurityCritical、部分信任組件 = SecurityTransparent。
  • SecurityTransparent 程式碼無法直接呼叫 SecurityCritical 程式碼。
  • APTCA 組件在 v4 中預設為 SecurityTransparent,需手動標記關鍵 API。

三大透明度屬性

屬性權限可被透明程式碼呼叫適用場景
SecurityTransparent低(不可執行危險操作)是大多數非敏感邏輯(預設)
SecurityCritical高(可執行任何特權操作)否內部核心邏輯、危險 API 封裝
SecuritySafeCritical高(同 Critical)是受控公開給部分信任的安全進入點(橋樑)

透明度屬性關係圖

遷移原則:屬性選擇指南

  1. 優先使用 SecurityTransparent:安全、審查門檻低、預設即為此屬性。
  2. 需公開給部分信任且呼叫危險 API → SecuritySafeCritical(謹慎使用,需嚴格驗證輸入/輸出、權限要求)。
  3. 不公開給部分信任、執行高風險操作 → SecurityCritical。
  4. 原則:能透明盡量透明;必須關鍵則標 Critical;只有確定安全的橋樑才用 SafeCritical。

SecAnnotate.exe 自動化輔助工具

.NET Framework SDK 提供 SecAnnotate.exe,掃描組件二進位,建議需標記的透明度屬性。運作機制為多輪掃描:

SecAnnotate.exe /p:1 /d:"referenced assemblies path" MyAssembly.dll
  • /p:1:僅執行第一輪掃描,避免過度標記 Critical 導致 API 無法被部分信任呼叫。
  • /d:指定參考組件路徑(預設僅搜尋 GAC)。
  • 輸出 XML 含 pass 屬性標示輪次,以最新輪次建議為準。

遷移實例:Logging 類別

v2 版本 使用 LinkDemand 保護 LogLocation setter,Assert 提權刪除日誌。

v4 版本 對應標記:

  • Usage():無危險操作 → Transparent(無需標記)
  • LogLocation.set:設定敏感路徑 → [SecurityCritical](取代 LinkDemand)
  • SetLogLocation():存取 Critical 成員,但邏輯安全且預期公開 → [SecuritySafeCritical]
  • DeleteLog():Assert 權限刪除檔案,受 LogLocation 保護 → [SecuritySafeCritical]
  • OtherLogging.Usage():覆寫 Transparent 方法且呼叫 Critical 成員 → 必須為 SafeCritical(SecAnnotate 可偵測此規則衝突)

常見遷移陷阱

  • 類別層級 LinkDemand → SecurityCritical:需逐一標記所有成員,而非僅標記類別。
  • 低權限 LinkDemand:建議移除並改用完整要求(Demand),保留部分信任呼叫能力。
  • 類別層級 SafeCritical 風險:後續新增成員會自動繼承,易造成安全漏洞;避免在類別層級使用 SafeCritical。
  • 覆寫成員不繼承類別層級屬性:需額外標記。

相容性選項

若短期無法完全遷移,可強制使用 Level 1 規則:

[assembly: SecurityRules(SecurityRuleSet.Level1)]

但不建議長期使用,Level 2 更安全、易審計、且跨平台一致(Silverlight/CoreCLR)。

應用程式相容性:TimeSpan 格式化

v4 實作 IFormattable,導致舊代碼 String.Format("{0:r}", timespan) 拋出 FormatException。解決方案:修正格式字串,或在 app.config 啟用舊模式:

<configuration>
  <runtime>
    <TimeSpan_LegacyFormatMode enabled="true"/>
  </runtime>
</configuration>
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved