Delen via


Beperkingen voor CLR-integratieprogrammeermodellen

van toepassing op:SQL ServerAzure SQL Managed Instance

Wanneer u een beheerde opgeslagen procedure of een ander beheerd databaseobject bouwt, voert SQL Server bepaalde codecontroles uit die moeten worden overwogen. Deze controles worden uitgevoerd op de beheerde codeassembly wanneer deze voor het eerst in de database zijn geregistreerd, met behulp van de CREATE ASSEMBLY-instructie en ook tijdens runtime. De beheerde code wordt ook gecontroleerd tijdens runtime omdat er in een assembly mogelijk codepaden zijn die nooit daadwerkelijk tijdens runtime worden bereikt.

Deze codecontroles bieden flexibiliteit voor het registreren van assembly's van derden, met name zodat een assembly niet wordt geblokkeerd wanneer er onveilige code is ontworpen om te worden uitgevoerd in een clientomgeving, maar nooit wordt uitgevoerd in de gehoste Common Language Runtime (CLR). De vereisten waaraan de beheerde code moet voldoen, zijn afhankelijk van of de assembly is geregistreerd als SAFE, EXTERNAL_ACCESSof UNSAFE. SAFE is het strengste beveiligingsniveau.

Naast beperkingen die worden ingesteld voor de beheerde codeassembly's, zijn er ook beveiligingsmachtigingen voor code die worden verleend. De CLR ondersteunt een beveiligingsmodel met de naam Code Access Security (CAS) voor beheerde code. In dit model worden machtigingen verleend aan assembly's op basis van de identiteit van de code. SAFE, EXTERNAL_ACCESSen UNSAFE assembly's hebben verschillende CAS-machtigingen. Zie CLR Integration Code Access Securityvoor meer informatie.

Als het uitgeversbeleid is ingesteld, mislukt CREATE ASSEMBLY.

ASSEMBLY-controles MAKEN

Wanneer de CREATE ASSEMBLY-instructie wordt uitgevoerd, worden de volgende controles uitgevoerd voor elk beveiligingsniveau. Als een controle mislukt, mislukt CREATE ASSEMBLY met een foutbericht.

Globaal (elk beveiligingsniveau)

Alle assembly's waarnaar wordt verwezen, moeten voldoen aan een of meer van de volgende criteria:

  • De assembly is al geregistreerd in de database.

  • De assembly is een van de ondersteunde assembly's. Zie Ondersteunde .NET Framework-bibliothekenvoor meer informatie.

  • U gebruikt CREATE ASSEMBLY FROM <location>en alle assembly's waarnaar wordt verwezen en de bijbehorende afhankelijkheden zijn beschikbaar in <location>.

  • U gebruikt CREATE ASSEMBLY FROM <bytes ...>en alle verwijzingen worden opgegeven via door spaties gescheiden bytes.

EXTERNAL_ACCESS

Alle EXTERNAL_ACCESS assembly's moeten voldoen aan de volgende criteria:

  • Statische velden worden niet gebruikt voor het opslaan van gegevens. Statische velden met het kenmerk Alleen-lezen zijn toegestaan.

  • De PEVerify-test wordt doorstaan. Het PEVerify-hulpprogramma (peverify.exe), waarmee wordt gecontroleerd of de algemene tussentaalcode (CIL) en de bijbehorende metagegevens voldoen aan de veiligheidsvereisten van het type, wordt geleverd met de .NET Framework SDK.

  • Synchronisatie, bijvoorbeeld met de klasse SynchronizationAttribute, wordt niet gebruikt.

  • Finalizer-methoden worden niet gebruikt.

De volgende aangepaste kenmerken zijn niet toegestaan in EXTERNAL_ACCESS assembly's:

  • 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

VEILIG

  • Alle EXTERNAL_ACCESS assemblyvoorwaarden worden gecontroleerd.

Runtimecontroles

Tijdens runtime wordt de codeassembly gecontroleerd op de volgende voorwaarden. Als een van deze voorwaarden wordt gevonden, mag de beheerde code niet worden uitgevoerd en wordt er een uitzondering gegenereerd.

ONVEILIG

U kunt een assembly niet expliciet laden door de methode System.Reflection.Assembly.Load() aan te roepen vanuit een bytematrix of impliciet met behulp van Reflection.Emit naamruimte.

EXTERNAL_ACCESS

Alle UNSAFE voorwaarden worden gecontroleerd.

Alle typen en methoden die zijn geannoteerd met de volgende HPA-waarden (Host Protection Attribute) in de ondersteunde lijst met assembly's, zijn niet toegestaan.

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

Zie Hostbeveiligingskenmerken en CLR-integratieprogrammeringvoor meer informatie over HPA's en een lijst met niet-toegestane typen en leden in de ondersteunde assembly's.

VEILIG

Alle EXTERNAL_ACCESS voorwaarden worden gecontroleerd.