SQL Server Atribut Pemrograman dan Perlindungan Host

Kemampuan untuk memuat dan menjalankan kode terkelola dalam host SQL Server memerlukan pemenuhan persyaratan host untuk keamanan akses kode dan perlindungan sumber daya host. Persyaratan keamanan akses kode ditentukan oleh salah satu dari tiga kumpulan izin SQL Server: SAFE, EXTERNAL-ACCESS, atau UNSAFE. Kode yang dijalankan dalam kumpulan izin SAFE atau EXTERNAL-ACCESS harus menghindari jenis atau anggota tertentu yang menerapkan atribut HostProtectionAttribute. HostProtectionAttribute bukanlah izin keamanan melainkan jaminan keandalan karena mengidentifikasi konstruksi kode tertentu, baik jenis maupun metode, yang mungkin tidak diizinkan oleh host. Penggunaan HostProtectionAttribute memberlakukan model pemrograman yang membantu melindungi stabilitas host.

Catatan

Keamanan Akses Kode (CAS) tidak digunakan lagi di semua versi .NET Framework dan .NET. Versi terbaru .NET tidak mematuhi anotasi CAS dan menghasilkan kesalahan jika API terkait CAS digunakan. Pengembang harus mencari cara alternatif untuk menyelesaikan tugas keamanan.

Atribut Perlindungan Tuan Rumah

Atribut perlindungan host mengidentifikasi jenis atau anggota yang tidak sesuai dengan model pemrograman host dan menunjukkan tingkat ancaman keandalan berikut:

  • Jika berbahaya.

  • Dapat menyebabkan destabilisasi kode pengguna yang dikelola server.

  • Dapat menyebabkan destabilisasi proses server itu sendiri.

SQL Server melarang penggunaan jenis atau anggota yang memiliki HostProtectionAttribute yang menetapkan nilai HostProtectionResourceSharedState, Synchronization, MayLeakOnAbort, atau ExternalProcessMgmt. Ini mencegah rakitan memanggil anggota yang mengaktifkan status berbagi, melakukan sinkronisasi, dapat menyebabkan kebocoran sumber daya saat penghentian, atau memengaruhi integritas proses SQL Server.

Jenis dan Anggota yang Dilarang

Tabel berikut mengidentifikasi jenis dan anggota yang nilai HostProtectionResource-nya tidak diizinkan oleh SQL Server.

Ruang nama Jenis atau anggota
Microsoft.Win32 PowerModeChangedEventArgs kelas

PowerModeChangedEventHandler delegasi

SessionEndedEventArgs kelas

SessionEndedEventHandler delegasi

SessionEndingEventArgs kelas

SessionEndingEventHandler delegasi

SessionSwitchEventArgs kelas

SessionSwitchEventHandler delegasi

SystemEvents kelas

TimerElapsedEventArgs kelas

TimerElapsedEventHandler delegasi

UserPreferenceChangedEventArgs kelas

UserPreferenceChangingEventArgs kelas
System.Collections metode ArrayList.Synchronized

metode Hashtable.Synchronized

metode Queue.Synchronized

metode SortedList.Synchronized

metode Stack.Synchronized
System.ComponentModel AddingNewEventArgs kelas

AddingNewEventHandler delegasi

ArrayConverter kelas

AsyncCompletedEventArgs kelas

AsyncCompletedEventHandler delegasi

AsyncOperation kelas

AsyncOperationManager kelas

AttributeCollection kelas

BackgroundWorker kelas

BaseNumberConverter kelas

BindingList<T> kelas

BooleanConverter kelas

ByteConverter kelas

CancelEventArgs kelas

CancelEventHandler delegasi

CharConverter kelas

CollectionChangeEventArgs kelas

CollectionChangeEventHandler delegasi

CollectionConverter kelas

ComponentCollection kelas

ComponentConverter kelas

ComponentEditor kelas

ComponentResourceManager kelas

Container kelas

ContainerFilterService kelas

CultureInfoConverter kelas

CustomTypeDescriptor kelas

DateTimeConverter kelas

DecimalConverter kelas

ActiveDesignerEventArgs kelas

ActiveDesignerEventHandler delegasi

CheckoutException kelas

CommandID kelas

ComponentChangedEventArgs kelas

ComponentChangedEventHandler delegasi

ComponentChangingEventArgs kelas

ComponentChangingEventHandler delegasi

ComponentEventArgs kelas

ComponentEventHandler delegasi

ComponentRenameEventArgs kelas

ComponentRenameEventHandler delegasi

DesignerCollection kelas

DesignerEventArgs kelas

DesignerEventHandler delegasi

DesignerOptionService kelas

DesignerTransaction kelas

DesignerTransactionCloseEventArgs kelas

DesignerTransactionCloseEventHandler delegasi

DesignerVerb kelas

DesignerVerbCollection kelas

DesigntimeLicenseContext kelas

DesigntimeLicenseContextSerializer kelas

MenuCommand kelas

ComponentSerializationService kelas

ContextStack kelas

DesignerLoader kelas

InstanceDescriptor kelas

MemberRelationshipService kelas

ResolveNameEventArgs kelas

ResolveNameEventHandler delegasi

SerializationStore kelas

ServiceContainer kelas

ServiceCreatorCallback delegasi

StandardCommands kelas

StandardToolWindows kelas

DoubleConverter kelas

DoWorkEventArgs kelas

DoWorkEventHandler delegasi

EnumConverter kelas

EventDescriptor kelas

EventDescriptorCollection kelas

EventHandlerList kelas

ExpandableObjectConverter kelas

HandledEventArgs kelas

HandledEventHandler delegasi

InstanceCreationEditor kelas

Int16Converter kelas

Int32Converter kelas

Int64Converter kelas

InvalidAsynchronousStateException kelas

InvalidEnumArgumentException kelas

metode BeginInvoke

License kelas

LicenseContext kelas

LicenseException kelas

LicenseManager kelas

LicenseProvider kelas

LicFileLicenseProvider kelas

ListChangedEventArgs kelas

ListChangedEventHandler delegasi

ListSortDescription kelas

ListSortDescriptionCollection kelas

MaskedTextProvider kelas

MemberDescriptor kelas

MultilineStringConverter kelas

NestedContainer kelas

NullableConverter kelas

ProgressChangedEventArgs kelas

ProgressChangedEventHandler delegasi

PropertyChangedEventArgs kelas

PropertyChangedEventHandler delegasi

PropertyDescriptor kelas

PropertyDescriptorCollection kelas

ReferenceConverter kelas

RefreshEventArgs kelas

RefreshEventHandler delegasi

RunWorkerCompletedEventArgs kelas

RunWorkerCompletedEventHandler delegasi

SByteConverter kelas

SingleConverter kelas

StringConverter kelas

SyntaxCheck kelas

TimeSpanConverter kelas

TypeConverter kelas

TypeDescriptionProvider kelas

TypeDescriptor kelas

TypeListConverter kelas

UInt16Converter kelas

UInt32Converter kelas

UInt64Converter kelas

WarningException kelas

Win32Exception kelas
System.Diagnostics Properti Debug.Listeners

Properti Trace.Listeners

Properti EventLog.SynchronizingObject

ConsoleTraceListener kelas

DefaultTraceListener kelas

DelimitedListTraceListener kelas

EventLogTraceListener kelas

PerformanceCounter kelas

PerformanceCounterCategory kelas

Process kelas

ProcessStartInfo kelas

TextWriterTraceListener kelas

TraceListener kelas

XmlWriterTraceListener kelas

Properti TraceSource.Listeners
System.IO metode Stream.Synchronized

metode TextReader.Synchronized

metode TextWriter.Synchronized
System.Reflection.Emit ConstructorBuilder kelas

EventBuilder kelas

FieldBuilder kelas

MethodBuilder kelas

CustomAttributeBuilder kelas

MethodRental kelas

ModuleBuilder kelas

PropertyBuilder kelas

TypeBuilder kelas

UnmanagedMarshal kelas
System.Text metode Group.Synchronized

metode Match.Synchronized
System.Threading AutoResetEvent kelas

EventWaitHandle kelas

ManualResetEvent kelas

Monitor kelas

Mutex kelas

ReaderWriterLock kelas

Semaphore kelas

metode Thread.AllocateNamedDataSlot

metode Thread.BeginCriticalRegion

metode Thread.EndCriticalRegion

metode Thread.FreeNamedDataSlot

metode Thread.GetData

metode Thread.Join

metode Thread.SetApartmentState

metode Thread.SetData

metode Thread.SpinWait

metode Thread.Start

metode Thread.TrySetApartmentState

ThreadPool kelas

Timer kelas
System.Timers Timer kelas
System.Web.Configuration MachineKeyValidationConverter kelas
System.Windows.Forms Properti AutoCompleteStringCollection.SyncRoot

Kumpulan Izin SQL Server

SQL Server memungkinkan pengguna menentukan persyaratan keandalan untuk kode yang disebarkan ke dalam database. Saat rakitan diunggah ke dalam database, pembuat rakitan dapat menentukan salah satu dari tiga kumpulan izin untuk perakitan tersebut: SAFE, EXTERNAL-ACCESS, atau UNSAFE.

Kumpulan izin SAFE EXTERNAL-ACCESS UNSAFE
Keamanan akses kode Jalankan saja Jalankan + akses ke sumber daya eksternal Tidak dibatasi
Pembatasan model pemrograman Ya Ya Tanpa batasan
Persyaratan keterverifikasian Ya Ya Tidak
Kemampuan untuk memanggil kode asli Tidak No Ya

SAFE adalah mode yang paling andal dan aman dengan pembatasan terkait dalam hal model pemrograman yang diizinkan. Kode SAFE memiliki fitur keandalan dan keamanan yang tinggi. Rakitan SAFE diberi izin yang cukup untuk menjalankan, melakukan komputasi, dan memiliki akses ke database lokal. Rakitan SAFE harus berjenis aman dan tidak diizinkan untuk memanggil kode yang tidak dikelola.

EXTERNAL-ACCESS menyediakan opsi keamanan perantara, memungkinkan kode mengakses sumber daya di luar database, tetapi masih memiliki keandalan dan keamanan SAFE.

UNSAFE adalah untuk kode yang sangat tepercaya yang hanya dapat dibuat oleh administrator database. Kode tepercaya ini tidak memiliki batasan akses kode, dan dapat memanggil kode tak dikelola (asli).

SQL Server menggunakan lapisan kebijakan keamanan akses kode tingkat host untuk menyiapkan kebijakan host yang memberikan salah satu dari tiga kumpulan izin berdasarkan kumpulan izin yang disimpan dalam katalog SQL Server. Kode terkelola yang berjalan di dalam database selalu mendapatkan salah satu kumpulan izin akses kode ini.

Pembatasan Model Pemrograman

Model pemrograman untuk kode terkelola di SQL Server memerlukan fungsi, prosedur, dan jenis yang tidak memerlukan penggunaan status yang disimpan di beberapa pemanggilan atau berbagi status di beberapa sesi pengguna. Selanjutnya, seperti yang dijelaskan sebelumnya, keberadaan status bersama dapat menyebabkan pengecualian kritis yang berdampak pada skalabilitas dan keandalan aplikasi.

Mengingat pertimbangan ini, SQL Server melarang penggunaan variabel statik dan anggota data statik. Untuk rakitan SAFE dan EXTERNAL-ACCESS, SQL Server memeriksa metadata rakitan pada waktu CREATE ASSEMBLY, dan gagal membuat rakitan tersebut jika menemukan penggunaan anggota dan variabel data statik.

Lihat juga