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

SQL Server 2005 SQLCLR 程式碼安全權限集完整解析:SAFE、EXTERNAL_ACCESS、UNSAFE 三層級機制

     編輯:關於SqlServer

SQL Server 2005 引入 **SQLCLR** 整合 .NET Framework,允許在資料庫內執行 managed code。為確保資料庫引擎穩定與安全,SQLCLR 組件 (Assembly) 必須宣告 **權限集**,決定其可存取的外部資源範圍。本文深度解析三大權限集 (`SAFE`, `EXTERNAL_ACCESS`, `UNSAFE`) 的授予 CAS (Code Access Security) 權限細節、適用場景、部署限制與安全最佳實務。

一、 三大權限集對照表

權限集核心能力外部資源存取部署需求風險等級
SAFE (預設)純運算、資料存取 (內部)、型別安全驗證❌ 無 (檔案、網路、登錄、其他 SQL 實例)資料庫擁有者 (db_owner) 即可部署🟢 低
EXTERNAL_ACCESSSAFE + 受限外部存取✅ 檔案系統、環境變數、登錄 (唯讀)、DNS、SMTP、其他 SQL 實例 (需 SqlClientPermission)**資料庫擁有者 + 登入具有 `EXTERNAL ACCESS ASSEMBLY` 伺服器權限** 或資料庫 `TRUSTWORTHY ON` + 簽署憑證/非對稱金鑰🟡 中
UNSAFE完全信任,可呼叫 Unmanaged Code、操作記憶體指標、建立執行緒✅ 無限制 (含 P/Invoke、COM、Win32 API)**sysadmin 固定伺服器角色** 或 `TRUSTWORTHY ON` + 簽署🔴 高 (可能導致 SQL Server 進程崩潰)

二、 SAFE 權限集:最受限、最安全

授予 CAS 權限 (僅列舉核心)

  • `SecurityPermission` (Execution) — 僅允許執行 managed code。
  • `SqlClientPermission` — **僅允許 Context Connection** (`context connection=true/yes`),禁止一般連線字串。

適用場景

  • 複雜純量函數、表值函數、預存程序、觸發器、使用者定義型別/彙總。
  • 邏輯僅涉及資料庫內部資料存取與運算 (字串處理、數學運算、XML 剖析、正則表達式)。
  • **原則:能用 SAFE 就不用 EXTERNAL_ACCESS。**

三、 EXTERNAL_ACCESS 權限集:受控外部存取

授予 CAS 權限關鍵項 (完整列表見原文表格)

  • `FileIOPermission` (Unrestricted) — **但受限於 SQL Server 服務帳戶 OS 權限** (若服務帳號無檔案存取權,CLR 也無法存取)。
  • `RegistryPermission` (ReadOnly: HKCR, HKLM, HKCU, HKCC, HKU)。
  • `SqlClientPermission` (Unrestricted) — **允許一般 ADO.NET 連線字串** 連接本機/遠端 SQL 實例。
  • `EnvironmentPermission`, `DnsPermission`, `SocketPermission` (IP only), `WebPermission` (Localhost HTTP), `SmtpPermission` (Connect), `EventLogPermission` (Local Admin)。

部署門檻 (關鍵)


-- 方法一:資料庫 TRUSTWORTHY + 簽署 (推薦生產環境)
ALTER DATABASE MyDB SET TRUSTWORTHY ON; -- 有安全風險,需評估
CREATE ASYMMETRIC KEY SQLCLR_Key FROM EXECUTABLE FILE = 'MyAssembly.dll';
CREATE LOGIN SQLCLR_Login FROM ASYMMETRIC KEY SQLCLR_Key;
GRANT EXTERNAL ACCESS ASSEMBLY TO SQLCLR_Login;

-- 方法二:登入直接授予伺服器權限 (簡單但權限過大)
GRANT EXTERNAL ACCESS ASSEMBLY TO [Domain\User];

典型用例

  • 讀取/寫入檔案 (匯入匯出、日誌、設定檔)。
  • 呼叫 Web Service / REST API (`HttpWebRequest`)。
  • 發送郵件 (`SmtpClient`)。
  • 存取登錄讀取設定。
  • 連接其他 SQL Server 實例 (分散式查詢替代方案)。

四、 UNSAFE 權限集:核子選項,極度謹慎

  • 允許 `Unmanaged Code` (P/Invoke `kernel32.dll` 等)、`Unverifiable Code` (指標操作)、建立執行緒、靜態欄位可變狀態。
  • **風險**:記憶體洩漏、存取違規 (Access Violation) → **SQL Server 進程直接崩潰**、資料損壞。
  • **僅限**:極少數需呼叫 Win32 API、舊版 COM 元件、高效能非受控運算庫且無法重寫為 Managed Code 的情況。
  • 部署需 **sysadmin**,建議嚴格代碼審查、獨立測試環境驗證穩定性後再上線。

五、 安全最佳實務總結


[ ] 優先使用 SAFE,滿足 90%+ 業務邏輯
[ ] EXTERNAL_ACCESS 僅用於確定需外部資源的組件
[ ] 部署 EXTERNAL_ACCESS/UNSAFE 採「簽署非對稱金鑰/憑證 + 授予登入權限」模式,**避免 TRUSTWORTHY ON**
[ ] SQLCLR 組件版本管理:來源碼納入版控、編譯輸出簽署、部署腳本化
[ ] 運行期監控:sys.dm_clr_appdomains, sys.dm_clr_loaded_assemblies, sys.dm_clr_tasks
[ ] 記憶體壓力:CLR 記憶體佔用計入 Max Server Memory 外部,需留足緩衝
[ ] 例外處理:所有 SQLCLR 進入點必須 Try/Catch,轉換為 SqlException 拋回 T-SQL
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved