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

剖析 SQL Server 2005 SQLCLR 程式碼安全性:從 CAS 到主機保護的完整防禦體系

     編輯:關於SqlServer

核心衝突:兩套安全模型的共存

SQLCLR 引入 .NET 執行環境至 SQL Server 進程內,引發 DBA 擔憂:開發人員程式碼擁有完整 .NET Framework 與 Win32 API 存取權,可能威脅資料完整性與伺服器穩定性。微軟透過分層防禦化解:

安全邊界劃分

保護範疇負責機制保護對象
資料庫物件與資料存取 SQL Server 安全模型 (登入/使用者/角色/權限) 資料表、視圖、預存程序、資料列
外部資源存取 (檔案、登錄、網路、其他 DB、Web Service) CLR 代碼存取安全性 (CAS) 作業系統層面資源
CLR 執行行為 (執行緒、記憶體、UI、進程控制) 主機保護屬性 (HPA) SQL Server 進程穩定性

CAS 在 SQLCLR 中的運作細節

  1. 組件載入時,CLR 收集證據:強名稱、發行者憑證、區域/網站 (SQLCLR 中位置證據無關)。
  2. 依四層策略 (Enterprise, Machine, User, AppDomain) 比對程式碼群組。
  3. 授予權限集 (Permission Set) = 所有符合群組權限的交集。
  4. 執行敏感 API 時進行堆疊檢查,呼叫鏈所有組件必須擁有該權限。

四種策略層級 CAS 權限交集示意圖

SQL Server 三種 PERMISSION_SET 對應 CAS 權限

  • SAFE:僅 SecurityPermission(Execution) + 內部資料存取,無任何外部權限。
  • EXTERNAL_ACCESS:SAFE + FileIOPermission, SocketPermission, RegistryPermission, SqlClientPermission 等外部存取權限。
  • UNSAFE:FullTrust,可呼叫 Unmanaged 程式碼、操作指標、P/Invoke。

主機保護屬性 (HPA) 強制限制

SQL Server 透過 HostProtectionResource 列舉禁止組件使用:

  • Synchronization (lock, Monitor) → 改用 SQL Server 鎖機制。
  • SharedState (static 可變欄位) → 改用資料表或 ThreadLocalStorage。
  • ExternalProcessMgmt (Process.Start) → 禁止啟動外部程式。
  • SelfAffectingProcessMgmt (Environment.Exit) → 禁止終止進程。
  • UI (MessageBox, Form) → 伺服器無互動桌面。
  • MayLeakOnAbort (不可靠資源) → 需在 finally 確實釋放。

部署授權流程

  1. 組件強名稱簽署 (sn.exe) 或憑證簽署。
  2. 資料庫建立非對稱金鑰/憑證:CREATE ASYMMETRIC KEY KeyName FROM EXECUTABLE FILE = 'path\Assembly.dll'
  3. 建立對應登入:CREATE LOGIN ClrLogin FROM ASYMMETRIC KEY KeyName
  4. 授予組件權限:GRANT EXTERNAL ACCESS ASSEMBLY TO ClrLogin 或 UNSAFE ASSEMBLY。
  5. 建立組件:CREATE ASSEMBLY AssemblyName FROM 'path\Assembly.dll' WITH PERMISSION_SET = EXTERNAL_ACCESS

可靠性最佳實務

  • 避免長時間持有鎖定,使用 context connection 簡化交易管理。
  • 大量記憶體配置物件實作 IDisposable 並 using 區塊釋放。
  • 嚴格捕獲例外,避免未處理例外導致 AppDomain 卸載。
  • 定期審核 UNSAFE 組件,評估替代方案降低風險。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved