共用方式為


CLR 整合程式設計模型限制

Applies to:SQL ServerAzure SQL Managed Instance

當您建置 Managed 預存程式或其他 Managed 資料庫物件時,SQL Server 會執行需要考慮的特定程式代碼檢查。 當第一次在資料庫中註冊、使用 CREATE ASSEMBLY 語句,以及在運行時間時,這些檢查會在Managed程式碼元件上執行。 在運行時間也會檢查 Managed 程式代碼,因為在元件中,可能會有程式代碼路徑在運行時間可能永遠不會實際到達。

These code checks provide flexibility for registering third-party assemblies especially, so that an assembly isn't blocked where there's unsafe code designed to run in a client environment, but would never be executed in the hosted common language runtime (CLR). Managed 程式代碼必須符合的需求取決於元件是否註冊為 SAFEEXTERNAL_ACCESSUNSAFESAFE 是最嚴格的安全性層級。

除了對 Managed 程式代碼元件的限制之外,也會授與程式代碼安全性許可權。 CLR 支援稱為 Managed 程式碼之程式碼存取安全性 (CAS) 的安全性模型。 在此模型中,會根據程式碼的身分識別,將許可權授與元件。 SAFEEXTERNAL_ACCESSUNSAFE 元件具有不同的 CAS 許可權。 如需詳細資訊,請參閱 CLR 整合程式代碼存取安全性

If the publisher policy is set, CREATE ASSEMBLY fails.

不再支援程式碼存取安全性

CLR 使用 .NET Framework 的 Code Access Security (CAS) 機制,但不再作為安全界限受支援。 使用 PERMISSION_SET = SAFE 所建立的 CLR 組件可以存取外部系統資源、呼叫非受控程式碼,以及取得系統管理員權限。 在 SQL Server 2017 (14.x) 和更新版本中,sp_configure 選項可增強 CLR 組件的安全性。 clr strict security 會依預設啟用,且將 SAFEEXTERNAL_ACCESS 組件視作已標記為 UNSAFE 一樣。 可以基於回溯相容性而停用 clr strict security 選項,但不建議這麼做。

我們建議您使用憑證或非對稱金鑰,並通過具有在資料庫中被授予 UNSAFE ASSEMBLY 權限的對應登入來簽署所有組件。 SQL Server 系統管理員也可以將組件新增至資料庫引擎應該信任的組件清單。 For more information, see sys.sp_add_trusted_assembly.

CREATE ASSEMBLY 檢查

CREATE ASSEMBLY當語句執行時,會針對每個安全性層級執行下列檢查。 如果有任何檢查失敗, CREATE ASSEMBLY 則失敗並出現錯誤訊息。

全域 (任何安全性層級)

所有參考的元件都必須符合下列一或多個準則:

  • 元件已在資料庫中註冊。

  • 元件是其中一個支援的元件。 如需詳細資訊,請參閱支援的 .NET Framework 連結庫。

  • CREATE ASSEMBLY FROM <location>您使用 的是 ,而且所有參考的元件及其相依性都可在 中使用<location>

  • 您使用的是 CREATE ASSEMBLY FROM <bytes ...>,而且所有參考都是透過空格分隔的位元組來指定。

EXTERNAL_ACCESS

所有 EXTERNAL_ACCESS 元件都必須符合下列準則:

  • 靜態欄位不會用來儲存資訊。 允許唯讀靜態欄位。

  • PEVerify 測試已通過。 PEVerify 工具 (peverify.exe)會檢查通用中繼語言 (CIL) 程式代碼和相關聯的元數據是否符合類型安全性需求,會隨附於 .NET Framework SDK。

  • 同步處理,例如,不會使用 類別 SynchronizationAttribute

  • 未使用完成項方法。

元件中 EXTERNAL_ACCESS 不允許下列自訂屬性:

  • System.ContextStaticAttribute
  • System.MTAThreadAttribute
  • System.Runtime.CompilerServices.MethodImplAttribute
  • System.Runtime.CompilerServices.CompilationRelaxationsAttribute
  • System.Runtime.Remoting.Contexts.ContextAttribute
  • System.Runtime.Remoting.Contexts.SynchronizationAttribute
  • System.Runtime.InteropServices.DllImportAttribute
  • System.Security.Permissions.CodeAccessSecurityAttribute
  • System.Security.SuppressUnmanagedCodeSecurityAttribute
  • System.Security.UnverifiableCodeAttribute
  • System.STAThreadAttribute
  • System.ThreadStaticAttribute

SAFE

  • 會檢查所有 EXTERNAL_ACCESS 元件條件。

Runtime checks

在運行時間,會檢查程式代碼元件是否有下列條件。 如果找到上述任何條件,則不允許執行 Managed 程式代碼,並擲回例外狀況。

UNSAFE

您無法透過從位元組數位列呼叫 System.Reflection.Assembly.Load() 方法,或隱含地使用 Reflection.Emit 命名空間,來載入元件。

EXTERNAL_ACCESS

會檢查所有 UNSAFE 條件。

不允許在支援的元件清單中,以下列主機保護屬性 (HPA) 值標註的所有類型和方法。

  • SelfAffectingProcessMgmt
  • SelfAffectingThreading
  • Synchronization
  • SharedState
  • ExternalProcessMgmt
  • ExternalThreading
  • SecurityInfrastructure
  • MayLeakOnAbort
  • UI

如需 HPA 和支援元件中不允許類型和成員清單的詳細資訊,請參閱 主機保護屬性和 CLR 整合程式設計

SAFE

會檢查所有 EXTERNAL_ACCESS 條件。