Beperkingen voor CLR-integratieprogrammeermodellen
van toepassing op:SQL Server
Azure 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_ACCESS
of 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_ACCESS
en 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.