Exportar (0) Imprimir
Expandir todo

Programación de SQL Server y atributos de protección del host

La capacidad de cargar y ejecutar código administrado en un host SQL Server requiere cumplir los requisitos del host tanto en lo relativo a seguridad de acceso a código como a protección de recursos del host. Los requisitos de seguridad de acceso a código se especifican a través de uno de los tres conjuntos de permisos de SQL Server: SAFE, EXTERNAL-ACCESS o UNSAFE. El código que ejecutado dentro de los conjuntos de permisos SAFE o EXTERNAL-ACCESS deben evitar ciertos tipos o miembros que tienen aplicado el atributo HostProtectionAttribute. El atributo HostProtectionAttribute no es tanto un permiso de seguridad como una garantía de fiabilidad en cuanto a que identifica construcciones de código específicas, bien sean tipos o métodos, que pueden no estar permitidos por el host. El uso del atributo HostProtectionAttribute fuerza un modelo de programación que ayuda a proteger la estabilidad del host.

Atributos de protección del host

Los atributos de protección del host identifican los tipos o miembros que no se ajustan al modelo de programación del host y representan los siguientes niveles crecientes de amenaza de confiabilidad:

  • En caso contrario son benignos.

  • Podrían provocar la desestabilización del código de usuario administrado por servidor.

  • Podría provocar la desestabilización del propio proceso de servidor.

SQL Server no permite el uso de un tipo o miembro que tenga un HostProtectionAttribute que especifique un valor de HostProtectionResource de SharedState, Synchronization, MayLeakOnAbort o ExternalProcessMgmt. De esta forma, se evita que los ensamblados llamen a miembros que habiliten el estado compartido, ejecuten la sincronización, puedan causar una pérdida de recursos al terminar o afecten la integridad de los procesos de SQL Server.

Tipos y miembros denegados

La tabla siguiente identifica los tipos y miembros cuyos valores de HostProtectionResource no están permitidos por SQL Server.

Espacio de nombres Tipo o miembro

Microsoft.Win32

PowerModeChangedEventArgs (clase)

Delegado de PowerModeChangedEventHandler

SessionEndedEventArgs (clase)

Delegado de SessionEndedEventHandler

SessionEndingEventArgs (clase)

Delegado de SessionEndingEventHandler

SessionSwitchEventArgs (clase)

Delegado de SessionSwitchEventHandler

SystemEvents (clase)

TimerElapsedEventArgs (clase)

Delegado de TimerElapsedEventHandler

UserPreferenceChangedEventArgs (clase)

UserPreferenceChangingEventArgs (clase)

System.Collections

Método System.Collections.ArrayList.Synchronized

Método System.Collections.Hashtable.Synchronized(System.Collections.Hashtable)

Método System.Collections.Queue.Synchronized(System.Collections.Queue)

Método System.Collections.SortedList.Synchronized(System.Collections.SortedList)

Método System.Collections.Stack.Synchronized(System.Collections.Stack)

System.ComponentModel

AddingNewEventArgs (clase)

Delegado de AddingNewEventHandler

ArrayConverter (clase)

AsyncCompletedEventArgs (clase)

Delegado de AsyncCompletedEventHandler

AsyncOperation (clase)

AsyncOperationManager (clase)

Clase AttributeCollection

BackgroundWorker (clase)

BaseNumberConverter (clase)

BindingList (clase)

BooleanConverter (clase)

ByteConverter (clase)

CancelEventArgs (clase)

Delegado de CancelEventHandler

CharConverter (clase)

CollectionChangeEventArgs (clase)

Delegado de CollectionChangeEventHandler

CollectionConverter (clase)

Clase ComponentCollection

ComponentConverter (clase)

ComponentEditor (clase)

ComponentResourceManager (clase)

Container (clase)

ContainerFilterService (clase)

CultureInfoConverter (clase)

CustomTypeDescriptor (clase)

DateTimeConverter (clase)

DecimalConverter (clase)

ActiveDesignerEventArgs (clase)

Delegado de ActiveDesignerEventHandler

CheckoutException (clase)

CommandID (clase)

ComponentChangedEventArgs (clase)

Delegado de ComponentChangedEventHandler

ComponentChangingEventArgs (clase)

Delegado de ComponentChangingEventHandler

ComponentEventArgs (clase)

Delegado de ComponentEventHandler

ComponentRenameEventArgs (clase)

Delegado de ComponentRenameEventHandler

DesignerCollection (clase)

DesignerEventArgs (clase)

Delegado de DesignerEventHandler

DesignerOptionService (clase)

DesignerTransaction (clase)

DesignerTransactionCloseEventArgs (clase)

Delegado de DesignerTransactionCloseEventHandler

DesignerVerb (clase)

DesignerVerbCollection (clase)

DesigntimeLicenseContext (clase)

DesigntimeLicenseContextSerializer (clase)

MenuCommand (clase)

ComponentSerializationService (clase)

ContextStack (clase)

DesignerLoader (clase)

InstanceDescriptor (clase)

MemberRelationshipService (clase)

ResolveNameEventArgs (clase)

Delegado de ResolveNameEventHandler

SerializationStore (clase)

ServiceContainer (clase)

Delegado de ServiceCreatorCallback

StandardCommands (clase)

StandardToolWindows (clase)

DoubleConverter (clase)

DoWorkEventArgs (clase)

Delegado de DoWorkEventHandler

EnumConverter (clase)

EventDescriptor (clase)

Clase EventDescriptorCollection

EventHandlerList (clase)

ExpandableObjectConverter (clase)

HandledEventArgs (clase)

Delegado de HandledEventHandler

InstanceCreationEditor (clase)

Int16Converter (clase)

Int32Converter (clase)

Int64Converter (clase)

InvalidAsynchronousStateException (clase)

InvalidEnumArgumentException (clase)

Método BeginInvoke

License (clase)

LicenseContext (clase)

LicenseException (clase)

Clase LicenseManager

LicenseProvider (clase)

LicFileLicenseProvider (clase)

ListChangedEventArgs (clase)

Delegado de ListChangedEventHandler

ListSortDescription (clase)

ListSortDescriptionCollection (clase)

MaskedTextProvider (clase)

MemberDescriptor (clase)

MultilineStringConverter (clase)

NestedContainer (clase)

NullableConverter (clase)

ProgressChangedEventArgs (clase)

Delegado de ProgressChangedEventHandler

PropertyChangedEventArgs (clase)

Delegado de PropertyChangedEventHandler

PropertyDescriptor (clase)

Clase PropertyDescriptorCollection

ReferenceConverter (clase)

RefreshEventArgs (clase)

Delegado de RefreshEventHandler

RunWorkerCompletedEventArgs (clase)

Delegado de RunWorkerCompletedEventHandler

SByteConverter (clase)

SingleConverter (clase)

StringConverter (clase)

SyntaxCheck (clase)

TimeSpanConverter (clase)

TypeConverter (clase)

TypeDescriptionProvider (clase)

TypeDescriptor (clase)

TypeListConverter (clase)

UInt16Converter (clase)

UInt32Converter (clase)

UInt64Converter (clase)

WarningException (clase)

Win32Exception (clase)

System.Diagnostics

Propiedad System.Diagnostics.Debug.Listeners

Propiedad System.Diagnostics.Trace.Listeners

Propiedad System.Diagnostics.EventLog.SynchronizingObject

ConsoleTraceListener (clase)

DefaultTraceListener (clase)

DelimitedListTraceListener (clase)

EventLogTraceListener (clase)

PerformanceCounter (clase)

PerformanceCounterCategory (clase)

Process (clase)

ProcessStartInfo (clase)

TextWriterTraceListener (clase)

TraceListener (clase)

XmlWriterTraceListener (clase)

Propiedad System.Diagnostics.TraceSource.Listeners

System.IO

Método System.IO.Stream.Synchronized(System.IO.Stream)

Método System.IO.TextReader.Synchronized(System.IO.TextReader)

Método System.IO.TextWriter.Synchronized(System.IO.TextWriter)

System.Reflection.Emit

ConstructorBuilder (clase)

EventBuilder (clase)

FieldBuilder (clase)

MethodBuilder (clase)

CustomAttributeBuilder (clase)

MethodRental (clase)

ModuleBuilder (clase)

PropertyBuilder (clase)

TypeBuilder (clase)

UnmanagedMarshal (clase)

System.Text

Método System.Text.RegularExpressions.Group.Synchronized(System.Text.RegularExpressions.Group)

Método System.Text.RegularExpressions.Match.Synchronized(System.Text.RegularExpressions.Match)

System.Threading

Clase AutoResetEvent

Clase EventWaitHandle

Clase ManualResetEvent

Clase Monitor

Clase Mutex

Clase ReaderWriterLock

Clase Semaphore

Método System.Threading.Thread.AllocateNamedDataSlot(System.String)

Método System.Threading.Thread.BeginCriticalRegion

Método System.Threading.Thread.EndCriticalRegion

Método System.Threading.Thread.FreeNamedDataSlot(System.String)

Método System.Threading.Thread.GetData(System.LocalDataStoreSlot)

Método System.Threading.Thread.Join

Método System.Threading.Thread.SetApartmentState(System.Threading.ApartmentState)

Método System.Threading.Thread.SetData(System.LocalDataStoreSlot,System.Object)

Método System.Threading.Thread.SpinWait(System.Int32)

Método System.Threading.Thread.Start

Método System.Threading.Thread.TrySetApartmentState(System.Threading.ApartmentState)

Clase ThreadPool

Clase Timer

System.Timers

Clase Timer

System.Web.Configuration

MachineKeyValidationConverter (clase)

System.Windows.Forms

Propiedad System.Windows.Forms.AutoCompleteStringCollection.SyncRoot

Conjuntos de permisos de SQL Server

SQL Server permite a los usuarios especificar los requisitos de confiabilidad para el código implementado en una base de datos. Cuando se cargan los ensamblados en la base de datos, el autor del ensamblado puede especificar uno de los tres conjuntos de permisos para dicho ensamblado: SAFE, EXTERNAL-ACCESS o UNSAFE.

Conjunto de permisos SAFE (Seguro) EXTERNAL-ACCESS (Acceso externo) UNSAFE (No seguro)

Seguridad de acceso a código

Sólo ejecución

Ejecución más acceso a recursos externos

Sin restricciones

Restricciones de modelo de programación

Sin restricciones

Requisito de verificabilidad

No

Capacidad de llamar a código nativo

No

No

SAFE es el modo más confiable y seguro con restricciones asociadas relativas al modelo de programación permitido. El código SAFE tiene confiabilidad alta y características de seguridad. Los ensamblados SAFE tienen permisos suficientes para la ejecución, realizar cálculos y tener acceso a la base de datos local. Los ensamblados SAFE deben tener verificabilidad de la seguridad de los tipos y no pueden llamar a código no administrado.

EXTERNAL-ACCESS proporciona una opción de seguridad intermedia, permitiendo al código tener acceso a los recursos externos a la base de datos pero teniendo todavía la confiabilidad y seguridad de SAFE.

UNSAFE está pensado para el código de alta confianza que sólo pueden crear los administradores de bases de datos. Este código de confianza no tiene ninguna restricción de acceso a código y puede llamar al código no administrado (nativo).

SQL Server utiliza la capa de directiva de seguridad de acceso a código de nivel de host para configurar una directiva de host que concede uno de los tres conjuntos de permisos basados en el conjunto de permisos almacenado en los catálogos de SQL Server. El código administrado que se ejecuta dentro de la base de datos siempre obtiene uno de estos conjuntos de permisos de acceso a código.

Restricciones del modelo de programación

El modelo de programación para el código administrado en SQL Server requiere funciones, procedimientos y tipos que no necesitan utilizar el estado mantenido a lo largo de varias invocaciones o compartir el estado entre varias sesiones de usuario. Además, como se explicó antes, la presencia de estado compartido puede producir excepciones críticas que tienen un impacto en la escalabilidad y la confiabilidad de la aplicación.

A la vista de estas consideraciones, SQL Server deniega el uso de variables estáticas y miembros de datos estáticos. En el caso de ensamblados SAFE y EXTERNAL-ACCESS, SQL Server examina los metadatos del ensamblado en tiempo de creación de ensamblado (CREATE ASSEMBLY) no puede crear dichos ensamblados si encuentra el uso de variables y miembros de datos estáticos.

Vea también

Adiciones de comunidad

AGREGAR
Mostrar:
© 2014 Microsoft