SQL Server programozási és hosztvédelmi attribútumok

A felügyelt kód SQL Server-gazdagépen való betöltéséhez és végrehajtásához meg kell felelnie a gazdagépnek a kódhozzáférés biztonságára és a gazdagép erőforrás-védelmére vonatkozó követelményeinek. A kódhozzáférés biztonsági követelményeit az SQL Server három engedélykészletének egyike határozza meg: SAFE, EXTERNAL-ACCESS vagy UNSAFE. A SAFE vagy EXTERNAL-ACCESS engedélykészleten belül végrehajtó kódnak kerülnie kell az attribútummal rendelkező HostProtectionAttribute bizonyos típusokat vagy tagokat. A HostProtectionAttribute nem annyira biztonsági engedély, mint amennyire megbízhatósági garancia, mivel azonosít olyan kódszerkezeteket – akár típusokat, akár metódusokat –, amelyeket a gazdagép esetleg elutasíthat. A HostProtectionAttribute használata olyan programozási modellt hoz létre, amely segít megvédeni a szerver stabilitását.

Megjegyzés:

A Code Access Security (CAS) elavult a .NET-keretrendszer és a .NET összes verziójában. A .NET legújabb verziói nem tartják tiszteletben a CAS-megjegyzéseket, és cas-okkal kapcsolatos API-k használata esetén hibákat okoznak. A fejlesztőknek alternatív módot kell keresnie a biztonsági feladatok elvégzésére.

Gazdagépvédelmi attribútumok

A gazdagép védelmi attribútumok olyan típusokat vagy tagokat azonosítanak, amelyek nem felelnek meg a gazdagép programozási modelljének, és a megbízhatósági fenyegetés növekvő szintjeit képviselik.

  • Egyébként jóindulatúak.

  • A kiszolgáló által felügyelt felhasználói kód destabilizálásához vezethet.

  • A kiszolgálói folyamat destabilizálásához vezethet.

Az SQL Server nem engedélyezi olyan típus vagy tag használatát, amely HostProtectionAttribute értéket a HostProtectionResourceSharedState, Synchronization, MayLeakOnAbort vagy ExternalProcessMgmt ad meg. Ez megakadályozza, hogy a szerelvények olyan tagokat hívjanak meg, amelyek engedélyezik az állapot megosztását, szinkronizálást végeznek, erőforrások szivárgását okozhatják a leállításkor, vagy hatással vannak az SQL Server-folyamat integritására.

Nem engedélyezett típusok és tagok

Az alábbi táblázat azokat a típusokat és tagokat azonosítja, amelyek HostProtectionResource értékeit az SQL Server nem engedélyezi.

Namespace Típus vagy tag
Microsoft.Win32 PowerModeChangedEventArgs osztály

PowerModeChangedEventHandler képviselő

SessionEndedEventArgs osztály

SessionEndedEventHandler képviselő

SessionEndingEventArgs osztály

SessionEndingEventHandler képviselő

SessionSwitchEventArgs osztály

SessionSwitchEventHandler képviselő

SystemEvents osztály

TimerElapsedEventArgs osztály

TimerElapsedEventHandler képviselő

UserPreferenceChangedEventArgs osztály

UserPreferenceChangingEventArgs osztály
System.Collections ArrayList.Synchronized módszer

Hashtable.Synchronized módszer

Queue.Synchronized módszer

SortedList.Synchronized módszer

Stack.Synchronized módszer
System.ComponentModel AddingNewEventArgs osztály

AddingNewEventHandler képviselő

ArrayConverter osztály

AsyncCompletedEventArgs osztály

AsyncCompletedEventHandler képviselő

AsyncOperation osztály

AsyncOperationManager osztály

AttributeCollection osztály

BackgroundWorker osztály

BaseNumberConverter osztály

BindingList<T> osztály

BooleanConverter osztály

ByteConverter osztály

CancelEventArgs osztály

CancelEventHandler képviselő

CharConverter osztály

CollectionChangeEventArgs osztály

CollectionChangeEventHandler képviselő

CollectionConverter osztály

ComponentCollection osztály

ComponentConverter osztály

ComponentEditor osztály

ComponentResourceManager osztály

Container osztály

ContainerFilterService osztály

CultureInfoConverter osztály

CustomTypeDescriptor osztály

DateTimeConverter osztály

DecimalConverter osztály

ActiveDesignerEventArgs osztály

ActiveDesignerEventHandler képviselő

CheckoutException osztály

CommandID osztály

ComponentChangedEventArgs osztály

ComponentChangedEventHandler képviselő

ComponentChangingEventArgs osztály

ComponentChangingEventHandler képviselő

ComponentEventArgs osztály

ComponentEventHandler képviselő

ComponentRenameEventArgs osztály

ComponentRenameEventHandler képviselő

DesignerCollection osztály

DesignerEventArgs osztály

DesignerEventHandler képviselő

DesignerOptionService osztály

DesignerTransaction osztály

DesignerTransactionCloseEventArgs osztály

DesignerTransactionCloseEventHandler képviselő

DesignerVerb osztály

DesignerVerbCollection osztály

DesigntimeLicenseContext osztály

DesigntimeLicenseContextSerializer osztály

MenuCommand osztály

ComponentSerializationService osztály

ContextStack osztály

DesignerLoader osztály

InstanceDescriptor osztály

MemberRelationshipService osztály

ResolveNameEventArgs osztály

ResolveNameEventHandler képviselő

SerializationStore osztály

ServiceContainer osztály

ServiceCreatorCallback képviselő

StandardCommands osztály

StandardToolWindows osztály

DoubleConverter osztály

DoWorkEventArgs osztály

DoWorkEventHandler képviselő

EnumConverter osztály

EventDescriptor osztály

EventDescriptorCollection osztály

EventHandlerList osztály

ExpandableObjectConverter osztály

HandledEventArgs osztály

HandledEventHandler képviselő

InstanceCreationEditor osztály

Int16Converter osztály

Int32Converter osztály

Int64Converter osztály

InvalidAsynchronousStateException osztály

InvalidEnumArgumentException osztály

BeginInvoke módszer

License osztály

LicenseContext osztály

LicenseException osztály

LicenseManager osztály

LicenseProvider osztály

LicFileLicenseProvider osztály

ListChangedEventArgs osztály

ListChangedEventHandler képviselő

ListSortDescription osztály

ListSortDescriptionCollection osztály

MaskedTextProvider osztály

MemberDescriptor osztály

MultilineStringConverter osztály

NestedContainer osztály

NullableConverter osztály

ProgressChangedEventArgs osztály

ProgressChangedEventHandler képviselő

PropertyChangedEventArgs osztály

PropertyChangedEventHandler képviselő

PropertyDescriptor osztály

PropertyDescriptorCollection osztály

ReferenceConverter osztály

RefreshEventArgs osztály

RefreshEventHandler képviselő

RunWorkerCompletedEventArgs osztály

RunWorkerCompletedEventHandler képviselő

SByteConverter osztály

SingleConverter osztály

StringConverter osztály

SyntaxCheck osztály

TimeSpanConverter osztály

TypeConverter osztály

TypeDescriptionProvider osztály

TypeDescriptor osztály

TypeListConverter osztály

UInt16Converter osztály

UInt32Converter osztály

UInt64Converter osztály

WarningException osztály

Win32Exception osztály
System.Diagnostics Debug.Listeners ingatlan

Trace.Listeners ingatlan

EventLog.SynchronizingObject ingatlan

ConsoleTraceListener osztály

DefaultTraceListener osztály

DelimitedListTraceListener osztály

EventLogTraceListener osztály

PerformanceCounter osztály

PerformanceCounterCategory osztály

Process osztály

ProcessStartInfo osztály

TextWriterTraceListener osztály

TraceListener osztály

XmlWriterTraceListener osztály

TraceSource.Listeners ingatlan
System.IO Stream.Synchronized módszer

TextReader.Synchronized módszer

TextWriter.Synchronized módszer
System.Reflection.Emit ConstructorBuilder osztály

EventBuilder osztály

FieldBuilder osztály

MethodBuilder osztály

CustomAttributeBuilder osztály

MethodRental osztály

ModuleBuilder osztály

PropertyBuilder osztály

TypeBuilder osztály

UnmanagedMarshal osztály
System.Text Group.Synchronized módszer

Match.Synchronized módszer
System.Threading AutoResetEvent osztály

EventWaitHandle osztály

ManualResetEvent osztály

Monitor osztály

Mutex osztály

ReaderWriterLock osztály

Semaphore osztály

Thread.AllocateNamedDataSlot módszer

Thread.BeginCriticalRegion módszer

Thread.EndCriticalRegion módszer

Thread.FreeNamedDataSlot módszer

Thread.GetData módszer

Thread.Join módszer

Thread.SetApartmentState módszer

Thread.SetData módszer

Thread.SpinWait módszer

Thread.Start módszer

Thread.TrySetApartmentState módszer

ThreadPool osztály

Timer osztály
System.Timers Timer osztály
System.Web.Configuration MachineKeyValidationConverter osztály
System.Windows.Forms AutoCompleteStringCollection.SyncRoot ingatlan

SQL Server engedélykészletek

Az SQL Server lehetővé teszi, hogy a felhasználók megadják az adatbázisba telepített kód megbízhatósági követelményeit. Amikor a szerelvényeket feltölti az adatbázisba, a szerelvény szerzője három engedélykészlet egyikét adhatja meg az adott szerelvényhez: SAFE, EXTERNAL-ACCESS vagy UNSAFE.

Engedélykészlet BIZTONSÁGOS EXTERNAL-ACCESS NEM BIZTONSÁGOS
Kódhozzáférés biztonsága Csak végrehajtás Végrehajtás + hozzáférés külső erőforrásokhoz Korlátlan
Programozási modell korlátozásai Igen Igen Nincsenek korlátozások
Ellenőrizhetőségi követelmény Igen Igen Nem
Natív kód meghívásának képessége Nem Nem Igen

A SAFE a legmegbízhatóbb és legbiztonságosabb mód az engedélyezett programozási modellre vonatkozó korlátozásokkal. A SAFE-kód magas megbízhatósági és biztonsági funkciókkal rendelkezik. A SAFE összeállítások elegendő engedélyt kapnak a számítások elvégzéséhez, a futtatáshoz és a helyi adatbázishoz való hozzáféréshez. A SAFE assembly-eknek ellenőrizhetően típusbiztonságosnak kell lenniük, és nem hívhatnak unmanaged kódot.

EXTERNAL-ACCESS köztes biztonsági lehetőséget biztosít, amely lehetővé teszi, hogy a kód hozzáférjen az adatbázison kívüli erőforrásokhoz, de továbbra is rendelkezik a SAFE megbízhatóságával és biztonságosságával.

A UNSAFE olyan megbízható kód, amelyet csak adatbázis-rendszergazdák hozhatnak létre. Ez a megbízható kód nem rendelkezik kódhozzáférés-korlátozásokkal, és meghívhat nem felügyelt (natív) kódot.

Az SQL Server a gazdagép szintű kódhozzáférési biztonsági irányelvi réteg használatával állít össze egy gazdagép irányelvet, amely az SQL Server-katalógusokban tárolt engedélykészlet alapján a három engedélykészlet egyikét biztosítja. Az adatbázisban futó felügyelt kód mindig megkapja az ilyen kódhozzáférés-engedélykészletek egyikét.

Programozási modell korlátozásai

Az SQL Server felügyelt kódjának programozási modellje olyan függvényeket, eljárásokat és típusokat igényel, amelyek nem igénylik az állapot fenntartását több meghívás során, illetve az állapot megosztását több felhasználói munkamenet között. A korábban leírtaknak megfelelően a megosztott állapot jelenléte kritikus kivételeket okozhat, amelyek befolyásolják az alkalmazás méretezhetőségét és megbízhatóságát.

Ezen szempontok figyelembevételével az SQL Server nem engedélyezi a statikus változók és a statikus adattagok használatát. A SAFE és EXTERNAL-ACCESS szerelvények esetében az SQL Server a CREATE ASSEMBLY időpontban megvizsgálja a szerelvény metaadatait, és nem hozza létre az ilyen szerelvényeket, ha statikus adattagok és változók használatát találja.

Lásd még