Bagikan melalui


Pembatasan model pemrograman integrasi CLR

Applies to:SQL ServerAzure SQL Managed Instance

Saat Anda membangun prosedur tersimpan terkelola atau objek database terkelola lainnya, SQL Server melakukan pemeriksaan kode tertentu yang perlu dipertimbangkan. Pemeriksaan ini dilakukan pada rakitan kode terkelola ketika pertama kali terdaftar dalam database, menggunakan CREATE ASSEMBLY pernyataan, dan juga pada runtime. Kode terkelola juga diperiksa pada runtime karena dalam rakitan mungkin ada jalur kode yang mungkin tidak pernah benar-benar dicapai pada runtime.

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). Persyaratan yang harus dipenuhi kode terkelola bergantung pada apakah assembly terdaftar sebagai SAFE, , EXTERNAL_ACCESSatau UNSAFE. SAFE adalah tingkat keamanan yang paling ketat.

Selain pembatasan yang ditempatkan pada rakitan kode terkelola, ada juga izin keamanan kode yang diberikan. CLR mendukung model keamanan yang disebut keamanan akses kode (CAS) untuk kode terkelola. Dalam model ini, izin diberikan kepada rakitan berdasarkan identitas kode. SAFE, EXTERNAL_ACCESS, dan UNSAFE rakitan memiliki izin CAS yang berbeda. Untuk informasi selengkapnya, lihat Keamanan akses kode integrasi CLR.

If the publisher policy is set, CREATE ASSEMBLY fails.

Keamanan akses kode tidak lagi didukung

Runtime bahasa umum menggunakan Keamanan Akses Kode (CAS) dalam .NET Framework, yang tidak lagi didukung sebagai batas keamanan. Rakitan CLR yang dibuat dengan PERMISSION_SET = SAFE mungkin dapat mengakses sumber daya sistem eksternal, memanggil kode yang tidak dikelola, dan memperoleh hak istimewa sysadmin. Di SQL Server 2017 (14.x) dan versi yang lebih baru, sp_configure opsi, keamanan ketat clr, meningkatkan keamanan rakitan CLR. clr strict security diaktifkan secara default, dan memperlakukan SAFE dan EXTERNAL_ACCESS rakitan seolah-olah ditandai UNSAFE. Opsi clr strict security dapat dinonaktifkan untuk kompatibilitas mundur, tetapi tidak disarankan.

Kami menyarankan agar Anda menandatangani semua rakitan dengan sertifikat atau kunci asimetris, dengan login terkait yang telah diberikan UNSAFE ASSEMBLY izin dalam master database. Administrator SQL Server juga dapat menambahkan rakitan ke daftar rakitan, yang harus dipercaya oleh Mesin Database. For more information, see sys.sp_add_trusted_assembly.

MEMBUAT pemeriksaan ASSEMBLY

CREATE ASSEMBLY Saat pernyataan berjalan, pemeriksaan berikut dilakukan untuk setiap tingkat keamanan. Jika ada pemeriksaan yang gagal, CREATE ASSEMBLY gagal dengan pesan kesalahan.

Global (tingkat keamanan apa pun)

Semua rakitan yang dirujuk harus memenuhi satu atau beberapa kriteria berikut:

  • Rakitan sudah terdaftar dalam database.

  • Rakitan adalah salah satu rakitan yang didukung. Untuk informasi selengkapnya, lihat pustaka .NET Framework yang didukung.

  • Anda menggunakan CREATE ASSEMBLY FROM <location>, dan semua rakitan yang direferensikan dan dependensinya tersedia di <location>.

  • Anda menggunakan CREATE ASSEMBLY FROM <bytes ...>, dan semua referensi ditentukan melalui byte yang dipisahkan spasi.

EXTERNAL_ACCESS

Semua EXTERNAL_ACCESS rakitan harus memenuhi kriteria berikut:

  • Bidang statis tidak digunakan untuk menyimpan informasi. Bidang statis baca-saja diperbolehkan.

  • Tes PEVerify diteruskan. Alat PEVerify (peverify.exe), yang memeriksa apakah kode bahasa perantara umum (CIL) dan metadata terkait memenuhi persyaratan keamanan jenis, disediakan dengan .NET Framework SDK.

  • Sinkronisasi, misalnya dengan SynchronizationAttribute kelas , tidak digunakan.

  • Metode finalizer tidak digunakan.

Atribut kustom berikut tidak diizinkan dalam EXTERNAL_ACCESS rakitan:

  • 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

  • Semua EXTERNAL_ACCESS kondisi perakitan diperiksa.

Runtime checks

Saat runtime, rakitan kode diperiksa untuk kondisi berikut. Jika salah satu kondisi ini ditemukan, kode terkelola tidak diizinkan untuk dijalankan, dan pengecualian dilemparkan.

UNSAFE

Anda tidak dapat memuat rakitan, baik secara eksplisit dengan memanggil System.Reflection.Assembly.Load() metode dari array byte, atau secara implisit menggunakan Reflection.Emit namespace.

EXTERNAL_ACCESS

Semua UNSAFE kondisi diperiksa.

Semua jenis dan metode yang dianotasi dengan nilai atribut perlindungan host (HPA) berikut dalam daftar rakitan yang didukung tidak diizinkan.

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

Untuk informasi selengkapnya tentang HPAs dan daftar jenis dan anggota yang tidak diizinkan di rakitan yang didukung, lihat atribut perlindungan host dan pemrograman integrasi CLR.

SAFE

Semua EXTERNAL_ACCESS kondisi diperiksa.