Sdílet prostřednictvím


Omezení programovacího modelu integrace CLR

Applies to:SQL ServerAzure SQL Managed Instance

Když sestavíte spravovanou uloženou proceduru nebo jiný spravovaný databázový objekt, SQL Server provede určité kontroly kódu, které je potřeba zvážit. Tyto kontroly se provádějí na sestavení spravovaného kódu při první registraci v databázi pomocí příkazu CREATE ASSEMBLY a také za běhu. Spravovaný kód je také kontrolován za běhu, protože v sestavení můžou být cesty ke kódu, které se nikdy ve skutečnosti nedosáhly za běhu.

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). Požadavky, které musí spravovaný kód splňovat, závisí na tom, zda je sestavení registrováno jako SAFE, EXTERNAL_ACCESSnebo UNSAFE. SAFE je nejvyšší úroveň zabezpečení.

Kromě omezení, která se umisťují do sestavení spravovaného kódu, existují také oprávnění zabezpečení kódu, která jsou udělena. CLR podporuje model zabezpečení označovaný jako zabezpečení přístupu kódu (CAS) pro spravovaný kód. V tomto modelu jsou oprávnění udělena sestavením na základě identity kódu. sestavení SAFE, EXTERNAL_ACCESSa UNSAFE mají různá oprávnění CAS. Další informace najdete v tématu Zabezpečení přístupu kódu integrace CLR.

If the publisher policy is set, CREATE ASSEMBLY fails.

Zabezpečení přístupu kódu se už nepodporuje.

CLR používá zabezpečení přístupu kódu (CAS) v rozhraní .NET Framework, které se už nepodporuje jako hranice zabezpečení. Sestavení CLR vytvořené s PERMISSION_SET = SAFE může mít přístup k externím systémovým prostředkům, volat nespravovaný kód a získat oprávnění správce systému. V SQL Serveru 2017 (14.x) a novějších verzích, možnost sp_configure, přísné zabezpečení CLR, vylepšuje zabezpečení sestavení CLR. clr strict security je ve výchozím nastavení povolen a se sestaveními SAFE a EXTERNAL_ACCESS zachází, jako by byla označena UNSAFE. Možnost clr strict security může být zakázaná kvůli zpětné kompatibilitě, ale nedoporučuje se.

Doporučujeme podepsat všechna sestavení certifikátem nebo asymetrickým klíčem s odpovídajícím přihlašovacím jménem, kterému bylo uděleno oprávnění UNSAFE ASSEMBLY v databázi master. Správci SQL Serveru mohou také přidat sestavení do seznamu sestavení, kterým má databázový stroj důvěřovat. For more information, see sys.sp_add_trusted_assembly.

KONTROLY SESTAVENÍ CREATE

Po spuštění příkazu CREATE ASSEMBLY se pro každou úroveň zabezpečení provádějí následující kontroly. Pokud nějaká kontrola selže, CREATE ASSEMBLY selže s chybovou zprávou.

Globální (jakákoli úroveň zabezpečení)

Všechna odkazovaná sestavení musí splňovat jedno nebo více následujících kritérií:

  • Sestavení je již zaregistrováno v databázi.

  • Sestavení je jedním z podporovaných sestavení. Další informace naleznete v tématu Podporované knihovny rozhraní .NET Framework.

  • Používáte CREATE ASSEMBLY FROM <location>a všechna odkazovaná sestavení a jejich závislosti jsou k dispozici v <location>.

  • Používáte CREATE ASSEMBLY FROM <bytes ...>a všechny odkazy jsou určené mezerami oddělenými bajty.

EXTERNAL_ACCESS

Všechna EXTERNAL_ACCESS sestavení musí splňovat následující kritéria:

  • Statická pole se nepoužívají k ukládání informací. Statická pole jen pro čtení jsou povolená.

  • Test PEVerify je úspěšný. Nástroj PEVerify (peverify.exe), který kontroluje, zda kód CIL (Common Intermediate Language) a přidružená metadata splňují požadavky na bezpečnost typů, je k dispozici se sadou .NET Framework SDK.

  • Synchronizace, například s SynchronizationAttribute třídou, se nepoužívá.

  • Metody finalizátoru se nepoužívají.

Následující vlastní atributy jsou v sestaveních EXTERNAL_ACCESS zakázány:

  • 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

  • Jsou kontrolovány všechny EXTERNAL_ACCESS podmínky sestavení.

Runtime checks

Za běhu je sestavení kódu kontrolováno pro následující podmínky. Pokud se najde některá z těchto podmínek, spravovaný kód se nesmí spustit a vyvolá se výjimka.

UNSAFE

Sestavení nelze načíst explicitně voláním metody System.Reflection.Assembly.Load() z pole bajtů nebo implicitně pomocí Reflection.Emit oboru názvů.

EXTERNAL_ACCESS

Zkontrolují se všechny UNSAFE podmínky.

Všechny typy a metody anotované s následujícími hodnotami atributu ochrany hostitele (HPA) v podporovaném seznamu sestavení jsou zakázány.

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

Další informace o rozhraníCH HPA a seznamu zakázaných typů a členů v podporovaných sestaveních naleznete v tématu Atributy ochrany hostitele a programování integrace CLR.

SAFE

Zkontrolují se všechny EXTERNAL_ACCESS podmínky.