Dela via


Begränsningar för CLR-integreringsprogrammeringsmodell

Applies to:SQL ServerAzure SQL Managed Instance

När du skapar en hanterad lagrad procedur eller ett annat hanterat databasobjekt utför SQL Server vissa kodkontroller som måste beaktas. Dessa kontroller utförs på den hanterade kodsammansättningen när den först registreras i databasen, med hjälp av CREATE ASSEMBLY-instruktionen och även vid körning. Den hanterade koden kontrolleras också vid körning eftersom det i en sammansättning kan finnas kodsökvägar som kanske aldrig nås vid körning.

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). Kraven som den hanterade koden måste uppfylla beror på om sammansättningen är registrerad som SAFE, EXTERNAL_ACCESSeller UNSAFE. SAFE är den strängaste säkerhetsnivån.

Förutom begränsningar för de hanterade kodsammansättningarna finns det även kodsäkerhetsbehörigheter som beviljas. CLR stöder en säkerhetsmodell som kallas kodåtkomstsäkerhet (CAS) för hanterad kod. I den här modellen beviljas behörigheter till sammansättningar baserat på kodens identitet. SAFE, EXTERNAL_ACCESSoch UNSAFE sammansättningar har olika CAS-behörigheter. Mer information finns i ÅTKOMSTsäkerhet för CLR-integreringskod.

If the publisher policy is set, CREATE ASSEMBLY fails.

Kodåtkomstsäkerhet stöds inte längre

CLR använder Code Access Security (CAS) i .NET Framework, som inte längre stöds som en säkerhetsgräns. En CLR-sammansättning som skapats med PERMISSION_SET = SAFE kan komma åt externa systemresurser, anropa ohanterad kod och hämta sysadmin-privilegier. I SQL Server 2017 (14.x) och senare versioner förbättrar alternativet sp_configure, strikt säkerhet, säkerheten för CLR-sammansättningar. clr strict security är aktiverat som standard och behandlar SAFE och EXTERNAL_ACCESS sammansättningar som om de hade markerats UNSAFE. Alternativet clr strict security kan inaktiveras för bakåtkompatibilitet, men rekommenderas inte.

Vi rekommenderar att du signerar alla sammansättningar med ett certifikat eller en asymmetrisk nyckel, med en motsvarande inloggning som har beviljats UNSAFE ASSEMBLY behörighet i master-databasen. SQL Server-administratörer kan också lägga till sammansättningar i en lista över sammansättningar som databasmotorn bör lita på. For more information, see sys.sp_add_trusted_assembly.

SKAPA SAMMANSÄTTNINGskontroller

När CREATE ASSEMBLY-instruktionen körs utförs följande kontroller för varje säkerhetsnivå. Om en kontroll misslyckas misslyckas CREATE ASSEMBLY med ett felmeddelande.

Global (alla säkerhetsnivåer)

Alla refererade sammansättningar måste uppfylla ett eller flera av följande kriterier:

  • Sammansättningen är redan registrerad i databasen.

  • Sammansättningen är en av de sammansättningar som stöds. Mer information finns i .NET Framework-bibliotek som stöds.

  • Du använder CREATE ASSEMBLY FROM <location>och alla refererade sammansättningar och deras beroenden är tillgängliga i <location>.

  • Du använder CREATE ASSEMBLY FROM <bytes ...>och alla referenser anges via blankstegsavgränsade byte.

EXTERNAL_ACCESS

Alla EXTERNAL_ACCESS sammansättningar måste uppfylla följande kriterier:

  • Statiska fält används inte för att lagra information. Skrivskyddade statiska fält tillåts.

  • PEVerify-testet har godkänts. PEVerify-verktyget (peverify.exe), som kontrollerar att den gemensamma mellanliggande språkkoden (CIL) och tillhörande metadata uppfyller typsäkerhetskraven, tillhandahålls med .NET Framework SDK.

  • Synkronisering, till exempel med klassen SynchronizationAttribute, används inte.

  • Finalizer-metoder används inte.

Följande anpassade attribut tillåts inte i EXTERNAL_ACCESS sammansättningar:

  • 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

  • Alla EXTERNAL_ACCESS sammansättningsvillkor kontrolleras.

Runtime checks

Vid körning kontrolleras kodsammansättningen för följande villkor. Om något av dessa villkor hittas tillåts inte den hanterade koden att köras och ett undantag genereras.

UNSAFE

Du kan inte läsa in en sammansättning, antingen explicit genom att anropa metoden System.Reflection.Assembly.Load() från en bytematris eller implicit med hjälp av Reflection.Emit namnrymd.

EXTERNAL_ACCESS

Alla UNSAFE villkor kontrolleras.

Alla typer och metoder som har kommenterats med följande värden för värdskyddsattribut (HPA) i listan över sammansättningar som stöds tillåts inte.

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

Mer information om HPA:er och en lista över otillåtna typer och medlemmar i de sammansättningar som stöds finns i Värdskyddsattribut och CLR-integreringsprogrammering.

SAFE

Alla EXTERNAL_ACCESS villkor kontrolleras.