共用方式為


CLR 整合程式碼存取安全性

Common Language Runtime (CLR) 支援稱為 Managed 程式碼之程式碼存取安全性的安全性模型。 在此模型中,將會根據程式碼的識別來授與權限給組件。 如需詳細資訊,請參閱 .NET Framework 軟體開發套件中的<程式碼存取安全性>一節。

下列三個不同的位置會定義可決定授與給組件之權限的安全性原則:

  • 電腦原則:這是安裝SQL Server之電腦上執行之所有 Managed 程式碼的作用原則。

  • 使用者原則:此原則適用於由處理序主控的 Managed 程式碼。 針對SQL Server服務正在執行中。

  • 主機原則:這是在此案例中由 CLR 主機 (所設定的原則,SQL Server) 該主機中執行的 Managed 程式碼生效。

CLR 所支援的程式碼存取安全性機制是根據執行階段可以主控完全信任和部分信任程式碼的假設。 受 CLR 程式碼存取安全性保護的資源通常會由受控應用程式程式設計介面包裝,這些介面需要對應的許可權,才能允許存取資源。 只有在呼叫堆疊中所有呼叫端 () 具有對應的資源許可權時,才會滿足許可權的需求。

在 SQL Server 內部執行時授與 Managed 程式碼的程式碼存取安全性許可權集合,授與載入SQL Server元件的許可權集,使用者和電腦層級原則可能會進一步限制提供給使用者程式碼的最終許可權集。

SQL Server 主機原則層級權限集合

由SQL Server主機原則層級授與元件的程式碼存取安全性許可權集合,取決於建立元件時所指定的許可權集合。 有三個許可權集合: SAFEEXTERNAL_ACCESS 並使用 UNSAFECREATE ASSEMBLY (Transact-SQL) ) PERMISSION_SET選項指定 (。

SQL Server。 此原則不適用於在 SQL Server 建立 CLR 執行個體時所生效的預設應用程式定義域。

系統元件SQL Server固定原則,以及使用者元件的使用者指定原則。

CLR 組件及 SQL Server 系統組件的固定原則授予它們完全的信任。

SQL Server主機原則的使用者指定部分是以每個元件指定三個許可權貯體之一的元件擁有者為基礎。 如需底下所列之安全性權限的詳細資訊,請參閱 .NET Framework SDK。

SAFE

僅允許內部計算和本機資料存取。 SAFE 是限制最嚴格的權限集合。 具有 SAFE 權限之組件所執行的程式碼無法存取外部系統資源,例如檔案、網路、環境變數或登錄。

SAFE 組件具有下列權限和值:

權限 值/描述
SecurityPermission Execution: 執行 Managed 程式碼的權限。
SqlClientPermission Context connection = truecontext connection = yes:只能使用內容連接,而且連接字串只能指定 "context connection=true" 或 "context connection=yes" 的值。

AllowBlankPassword = false: 不允許空白密碼。

EXTERNAL_ACCESS

EXTERNAL_ACCESS元件具有與 SAFE 元件相同的許可權,而且能夠存取外部系統資源,例如檔案、網路、環境變數和登錄。

EXTERNAL_ACCESS 組件也具有下列權限和值:

權限 值/描述
DistributedTransactionPermission Unrestricted: 允許分散式交易。
DNSPermission Unrestricted: 從功能變數名稱伺服器要求資訊的許可權。
EnvironmentPermission Unrestricted: 允許對系統和使用者環境變數的完整存取。
EventLogPermission Administer: 允許下列動作:建立事件來源、讀取現有的記錄檔、刪除事件來源或記錄檔、回應項目、清除事件記錄檔、接聽事件及存取所有事件記錄檔的集合。
FileIOPermission Unrestricted: 允許對檔案和資料夾的完整存取。
KeyContainerPermission Unrestricted: 允許對金鑰容器的完整存取。
NetworkInformationPermission Access: 允許 Ping。
RegistryPermission 允許對 HKEY_CLASSES_ROOTHKEY_LOCAL_MACHINEHKEY_CURRENT_USERHKEY_CURRENT_CONFIGHKEY_USERS. 的讀取權。
SecurityPermission Assertion: 判斷此程式碼的所有呼叫端都具有此作業之必要權限的功能。

ControlPrincipal: 操作主體物件的功能。

Execution: 執行 Managed 程式碼的權限。

SerializationFormatter: 提供序列化服務的功能。
SmtpPermission Access: 允許與 SMTP 主機通訊埠 25 的傳出連接。
SocketPermission Connect: 允許傳輸位址上的傳出連接 (所有通訊埠、所有通訊協定)。
SqlClientPermission Unrestricted: 允許對資料來源的完整存取。
StorePermission Unrestricted: 允許對 X.509 憑證存放區的完整存取。
WebPermission Connect: 允許對 Web 資源的傳出連接。

UNSAFE

UNSAFE 允許元件不受限制地存取SQL Server內部和外部的資源。 從 UNSAFE 組件內執行的程式碼也可以呼叫 Unmanaged 程式碼。

UNSAFE 會提供給 FullTrust 組件。

重要

SAFE是元件的建議許可權設定,這些元件會執行計算和資料管理工作,而不需存取SQL Server以外的資源。 EXTERNAL_ACCESS元件預設會以SQL Server服務帳戶的形式執行,執行的許可權 EXTERNAL_ACCESS 應該只提供給信任的登入,以作為服務帳戶執行。 從安全性的角度來看,EXTERNAL_ACCESSUNSAFE 組件相同。 不過,EXTERNAL_ACCESS 組件提供 UNSAFE 組件中沒有的各種可靠性及強固性保護。 指定 UNSAFE 可讓元件中的程式碼對SQL Server執行不合法的作業。 如需在 SQL Server 中建立 CLR 元件的詳細資訊,請參閱管理 CLR 整合元件

存取外部資源

如果使用者定義型別 (UDT)、預存程序或其他型別的建構組件是以 SAFE 權限集合註冊,在此建構中執行的 Managed 程式碼便無法存取外部資源。 不過,如果 EXTERNAL_ACCESS 指定 或 UNSAFE 許可權集合,且 Managed 程式碼嘗試存取外部資源,SQL Server會套用下列規則:

如果 結果為
執行內容對應至 SQL Server 登入。 拒絕存取外部資源的嘗試,並引發安全性例外狀況。
執行內容對應至 Windows 登入,並且執行內容是原始呼叫端。 在 SQL Server 服務帳戶的安全性內容下存取外部資源。
呼叫端不是原始呼叫端。 拒絕存取並引發安全性例外狀況。
執行內容會對應至 Windows 登入、執行內容就是原始呼叫端,而且已模擬呼叫端。 存取會使用呼叫端安全性內容,而不是服務帳戶。

權限集合摘要

下圖將摘要列出授與 SAFEEXTERNAL_ACCESSUNSAFE 權限集合的權限與限制。

SAFE EXTERNAL_ACCESS UNSAFE
Code Access Security Permissions 僅限 Execute 對外部資源的 Execute + 存取權 不受限制 (包括 P/Invoke)
Programming model restrictions Yes 沒有限制
Verifiability requirement No
Local data access
Ability to call native code No No

另請參閱

CLR 整合安全性
主機保護屬性和 CLR 整合程式設計
CLR 整合程式設計模型限制
CLR 主控環境