首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 2005 SQLCLR 程式碼安全模型深度解析:CLR CAS 與主機保護

     編輯:關於SqlServer

雙重安全模型

SQLCLR 程式碼在 SQL Server 內執行時,同時受兩套安全系統管控:

  1. SQL Server 安全模型:基於主體 (登入/使用者/角色) 的權限檢查,保護資料庫物件與資料存取。
  2. CLR 代碼存取安全性 (CAS):基於程式碼證據 (強名稱、簽章、來源) 授予權限,保護資料庫外部資源 (檔案、登錄、網路、其他資料庫、Web Service)。

關鍵原則:SQL Server 權限管內部,CAS 管外部。即使擁有 sysadmin,CLR 程式碼若無 FileIOPermission 也無法讀寫磁碟檔案。

CAS 運作機制

  1. 載入組件時,CLR 收集證據 (位置、強名稱、發行者簽章)。
  2. 依機器/企業/使用者/應用程式域四層策略,將組件歸入程式碼群組。
  3. 每個程式碼群組關聯一個權限集 (Permission Set),決定該組件可執行的敏感操作。
  4. 執行敏感 API 時,CLR 堆疊檢查呼叫鏈上所有組件是否擁有所需權限,缺一不可。

SQL Server 整合 CLR 安全的三種權限層級

PERMISSION_SETCAS 權限適用場景風險
SAFE (預設) 僅允許運算、資料存取、內部邏輯,禁止存取外部資源 純計算、字串處理、資料轉換 最低
EXTERNAL_ACCESS 允許存取檔案、網路、登錄、其他資料庫 讀寫檔案、呼叫 Web Service、跨資料庫查詢 中等,需簽署強名稱/憑證
UNSAFE 完全信任,可呼叫 Unmanaged 程式碼、Win32 API、操作記憶體指標 極少數極度複雜互通場景 最高,可能導致 SQL Server 進程崩潰

主機保護屬性 (HPA)

SQL Server 作為 CLR 主機,透過 HostProtectionAttribute 禁止組件使用特定 .NET 功能:

  • 同步化物件 (Syncronization) → 防止死鎖影響排程器。
  • 共享狀態 (SharedState) → 隔離 AppDomain。
  • 外部程序呼叫 (ExternalProcessMgmt) → 禁止 Process.Start。
  • 自我影響 (SelfAffectingProcessMgmt) → 禁止 Environment.Exit。
  • UI 操作 (UI) → 伺服器端無互動桌面。

違反 HPA 的程式碼在載入時即會擲回 PolicyException。

AppDomain 隔離機制

  • 相同擁有者的組件載入同一 AppDomain,可互相反射存取,提升效能。
  • 不同擁有者隔離於不同 AppDomain,安全邊界清晰。
  • AppDomain 卸載可釋放記憶體,但需注意靜態欄位殘留。

最佳實務

  1. 優先使用 SAFE,功能不足再提升至 EXTERNAL_ACCESS。
  2. 組件必須強名稱簽署或憑證簽署,資料庫擁有者建立非對稱金鑰/憑證登入並授予 EXTERNAL ACCESS ASSEMBLY / UNSAFE ASSEMBLY 權限。
  3. 避免在 SQLCLR 中使用靜態可變狀態,改用 ThreadLocalStorage 或資料表暫存。
  4. 大量 I/O 操作改用 T-SQL BULK INSERT/bcp 或 SSIS,勿在 SQLCLR 迴圈讀寫檔案。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved