Bagikan melalui


Atribut Pemrograman dan Perlindungan Host SQL Server

Kemampuan untuk memuat dan menjalankan kode terkelola di host SQL Server mengharuskan memenuhi persyaratan host untuk keamanan akses kode dan perlindungan sumber daya host. Persyaratan keamanan akses kode ditentukan oleh salah satu dari tiga set izin SQL Server: SAFE, EXTERNAL-ACCESS, atau UNSAFE. Kode yang dijalankan dalam set izin SAFE atau EXTERNAL-ACCESS harus menghindari jenis atau anggota tertentu yang memiliki HostProtectionAttribute atribut yang diterapkan. HostProtectionAttribute ini bukan izin keamanan sebanyak jaminan keandalan karena mengidentifikasi konstruksi kode tertentu, baik jenis atau metode, yang mungkin dilarang host. Penggunaan HostProtectionAttribute memberlakukan model pemrograman yang membantu melindungi stabilitas host.

Nota

Keamanan Akses Kode (CAS) telah 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 Host

Atribut perlindungan host mengidentifikasi jenis atau anggota yang tidak sesuai dengan model pemrograman host dan mewakili peningkatan 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 dengan HostProtectionAttribute yang menentukan 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.

Tipe dan Anggota yang Tidak Diizinkan

Tabel berikut mengidentifikasi jenis dan anggota yang nilainya HostProtectionResource tidak diizinkan oleh SQL Server.

Ruang Nama Tipe atau anggota
Microsoft.Win32 kelas PowerModeChangedEventArgs

PowerModeChangedEventHandler Mendelegasikan

kelas SessionEndedEventArgs

SessionEndedEventHandler Mendelegasikan

kelas SessionEndingEventArgs

SessionEndingEventHandler Mendelegasikan

kelas SessionSwitchEventArgs

SessionSwitchEventHandler Mendelegasikan

kelas SystemEvents

kelas TimerElapsedEventArgs

TimerElapsedEventHandler Mendelegasikan

kelas UserPreferenceChangedEventArgs

kelas UserPreferenceChangingEventArgs
System.Collections metode ArrayList.Synchronized

metode Hashtable.Synchronized

metode Queue.Synchronized

metode SortedList.Synchronized

metode Stack.Synchronized
System.ComponentModel kelas AddingNewEventArgs

AddingNewEventHandler Mendelegasikan

kelas ArrayConverter

kelas AsyncCompletedEventArgs

AsyncCompletedEventHandler Mendelegasikan

kelas AsyncOperation

kelas AsyncOperationManager

kelas AttributeCollection

kelas BackgroundWorker

kelas BaseNumberConverter

kelas BindingList<T>

kelas BooleanConverter

kelas ByteConverter

kelas CancelEventArgs

CancelEventHandler Mendelegasikan

kelas CharConverter

kelas CollectionChangeEventArgs

CollectionChangeEventHandler Mendelegasikan

kelas CollectionConverter

kelas ComponentCollection

kelas ComponentConverter

kelas ComponentEditor

kelas ComponentResourceManager

kelas Container

kelas ContainerFilterService

kelas CultureInfoConverter

kelas CustomTypeDescriptor

kelas DateTimeConverter

kelas DecimalConverter

kelas ActiveDesignerEventArgs

ActiveDesignerEventHandler Mendelegasikan

kelas CheckoutException

kelas CommandID

kelas ComponentChangedEventArgs

ComponentChangedEventHandler Mendelegasikan

kelas ComponentChangingEventArgs

ComponentChangingEventHandler Mendelegasikan

kelas ComponentEventArgs

ComponentEventHandler Mendelegasikan

kelas ComponentRenameEventArgs

ComponentRenameEventHandler Mendelegasikan

kelas DesignerCollection

kelas DesignerEventArgs

DesignerEventHandler Mendelegasikan

kelas DesignerOptionService

kelas DesignerTransaction

kelas DesignerTransactionCloseEventArgs

DesignerTransactionCloseEventHandler Mendelegasikan

kelas DesignerVerb

kelas DesignerVerbCollection

kelas DesigntimeLicenseContext

kelas DesigntimeLicenseContextSerializer

kelas MenuCommand

kelas ComponentSerializationService

kelas ContextStack

kelas DesignerLoader

kelas InstanceDescriptor

kelas MemberRelationshipService

kelas ResolveNameEventArgs

ResolveNameEventHandler Mendelegasikan

kelas SerializationStore

kelas ServiceContainer

ServiceCreatorCallback Mendelegasikan

kelas StandardCommands

kelas StandardToolWindows

kelas DoubleConverter

kelas DoWorkEventArgs

DoWorkEventHandler Mendelegasikan

kelas EnumConverter

kelas EventDescriptor

kelas EventDescriptorCollection

kelas EventHandlerList

kelas ExpandableObjectConverter

kelas HandledEventArgs

HandledEventHandler Mendelegasikan

kelas InstanceCreationEditor

kelas Int16Converter

kelas Int32Converter

kelas Int64Converter

kelas InvalidAsynchronousStateException

kelas InvalidEnumArgumentException

metode BeginInvoke

kelas License

kelas LicenseContext

kelas LicenseException

kelas LicenseManager

kelas LicenseProvider

kelas LicFileLicenseProvider

kelas ListChangedEventArgs

ListChangedEventHandler Mendelegasikan

kelas ListSortDescription

kelas ListSortDescriptionCollection

kelas MaskedTextProvider

kelas MemberDescriptor

kelas MultilineStringConverter

kelas NestedContainer

kelas NullableConverter

kelas ProgressChangedEventArgs

ProgressChangedEventHandler Mendelegasikan

kelas PropertyChangedEventArgs

PropertyChangedEventHandler Mendelegasikan

kelas PropertyDescriptor

kelas PropertyDescriptorCollection

kelas ReferenceConverter

kelas RefreshEventArgs

RefreshEventHandler Mendelegasikan

kelas RunWorkerCompletedEventArgs

RunWorkerCompletedEventHandler Mendelegasikan

kelas 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
System.Diagnostics Debug.Listeners Properti

Trace.Listeners Properti

EventLog.SynchronizingObject Properti

kelas ConsoleTraceListener

kelas DefaultTraceListener

kelas DelimitedListTraceListener

kelas EventLogTraceListener

kelas PerformanceCounter

kelas PerformanceCounterCategory

kelas Process

kelas ProcessStartInfo

kelas TextWriterTraceListener

kelas TraceListener

kelas XmlWriterTraceListener

TraceSource.Listeners Properti
System.IO metode Stream.Synchronized

metode TextReader.Synchronized

metode TextWriter.Synchronized
System.Reflection.Emit kelas ConstructorBuilder

kelas EventBuilder

kelas FieldBuilder

kelas MethodBuilder

kelas CustomAttributeBuilder

kelas MethodRental

kelas ModuleBuilder

kelas PropertyBuilder

kelas TypeBuilder

kelas UnmanagedMarshal
System.Text metode Group.Synchronized

metode Match.Synchronized
System.Threading kelas AutoResetEvent

kelas EventWaitHandle

kelas ManualResetEvent

kelas Monitor

kelas Mutex

kelas ReaderWriterLock

kelas Semaphore

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

kelas ThreadPool

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

Set Hak Akses 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 set izin untuk rakitan tersebut: AMAN, EXTERNAL-ACCESS, atau TIDAK AMAN.

Set izin SELAMAT EXTERNAL-ACCESS TIDAK AMAN
Keamanan akses kode Jalankan saja Jalankan + akses ke sumber daya eksternal Tidak dibatasi
Pembatasan model pemrograman Ya Ya Tidak ada batasan
Persyaratan keterverifikasian Ya Ya Tidak.
Kemampuan untuk memanggil kode asli Tidak. Tidak. 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 tingkat menengah, memungkinkan akses kode ke sumber daya di luar database tetapi masih memiliki keandalan dan keamanan kategori 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 yang tidak dikelola (asli).

SQL Server menggunakan lapisan kebijakan keamanan akses kode tingkat host untuk menyiapkan kebijakan host yang memberikan salah satu dari tiga set 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 statis dan anggota data statis. Untuk rakitan YANG AMAN dan EXTERNAL-ACCESS, SQL Server memeriksa metadata rakitan pada waktu CREATE ASSEMBLY, dan gagal dalam pembuatan rakitan tersebut jika menemukan penggunaan anggota dan variabel data statis.

Lihat juga