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

La capacidad para cargar y ejecutar código administrado en un host de SQL Server requiere que se cumplan los requisitos del host tanto para la seguridad de acceso del código como para la protección de los recursos del host. Los requisitos de la seguridad de acceso del código se especifican mediante uno de tres conjuntos de permisos de SQL Server: SAFE, EXTERNAL-ACCESS o UNSAFE. El código que se ejecuta dentro de los conjuntos de permisos SAFE o EXTERNAL-ACCESS debe evitar ciertos tipos o miembros que tienen aplicado el atributo HostProtectionAttribute. HostProtectionAttribute no es un permiso de seguridad, por más que una garantía de confiabilidad identifique construcciones de código específico (ya sean tipos o métodos) que el host podría rechazar. El uso del atributo HostProtectionAttribute exige un modelo de programación de ayuda para proteger la estabilidad del host.

Nota

La seguridad de acceso del código (CAS) ha quedado en desuso en todas las versiones de .NET Framework y .NET. Las versiones recientes de .NET no respetan las anotaciones de CAS y generan errores si se usan API relacionadas con CAS. Los desarrolladores deben buscar medios alternativos para realizar tareas de seguridad.

Atributos de protección del host

Los atributos de protección del host identifican los tipos o los 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 favorables.

  • 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 tiene un HostProtectionAttribute que especifica un valor HostProtectionResource de SharedState, Synchronization, MayLeakOnAbort o ExternalProcessMgmt. Esto impide que los ensamblados llamen a los miembros que habilitan el estado compartido, realizan una sincronización, podrían provocar una pérdida de recursos al finalizar o afectan a la integridad del proceso de SQL Server.

Tipos y miembros no permitidos

En la tabla siguiente se identifican los tipos y miembros cuyos valores HostProtectionResource no están permitidos en SQL Server.

Espacio de nombres Tipo o miembro
Microsoft.Win32 Clase PowerModeChangedEventArgs

DelegadoPowerModeChangedEventHandler

Clase SessionEndedEventArgs

DelegadoSessionEndedEventHandler

Clase SessionEndingEventArgs

DelegadoSessionEndingEventHandler

Clase SessionSwitchEventArgs

DelegadoSessionSwitchEventHandler

Clase SystemEvents

Clase TimerElapsedEventArgs

DelegadoTimerElapsedEventHandler

Clase UserPreferenceChangedEventArgs

Clase UserPreferenceChangingEventArgs
System.Collections Método ArrayList.Synchronized

Método Hashtable.Synchronized

Método Queue.Synchronized

Método SortedList.Synchronized

Método Stack.Synchronized
System.ComponentModel Clase AddingNewEventArgs

DelegadoAddingNewEventHandler

Clase ArrayConverter

Clase AsyncCompletedEventArgs

DelegadoAsyncCompletedEventHandler

Clase AsyncOperation

Clase AsyncOperationManager

Clase AttributeCollection

Clase BackgroundWorker

Clase BaseNumberConverter

Clase BindingList<T>

Clase BooleanConverter

Clase ByteConverter

Clase CancelEventArgs

DelegadoCancelEventHandler

Clase CharConverter

Clase CollectionChangeEventArgs

DelegadoCollectionChangeEventHandler

Clase CollectionConverter

Clase ComponentCollection

Clase ComponentConverter

Clase ComponentEditor

Clase ComponentResourceManager

Clase Container

Clase ContainerFilterService

Clase CultureInfoConverter

Clase CustomTypeDescriptor

Clase DateTimeConverter

Clase DecimalConverter

Clase ActiveDesignerEventArgs

DelegadoActiveDesignerEventHandler

Clase CheckoutException

Clase CommandID

Clase ComponentChangedEventArgs

DelegadoComponentChangedEventHandler

Clase ComponentChangingEventArgs

DelegadoComponentChangingEventHandler

Clase ComponentEventArgs

DelegadoComponentEventHandler

Clase ComponentRenameEventArgs

DelegadoComponentRenameEventHandler

Clase DesignerCollection

Clase DesignerEventArgs

DelegadoDesignerEventHandler

Clase DesignerOptionService

Clase DesignerTransaction

Clase DesignerTransactionCloseEventArgs

DelegadoDesignerTransactionCloseEventHandler

Clase DesignerVerb

Clase DesignerVerbCollection

Clase DesigntimeLicenseContext

Clase DesigntimeLicenseContextSerializer

Clase MenuCommand

Clase ComponentSerializationService

Clase ContextStack

Clase DesignerLoader

Clase InstanceDescriptor

Clase MemberRelationshipService

Clase ResolveNameEventArgs

DelegadoResolveNameEventHandler

Clase SerializationStore

Clase ServiceContainer

DelegadoServiceCreatorCallback

Clase StandardCommands

Clase StandardToolWindows

Clase DoubleConverter

Clase DoWorkEventArgs

DelegadoDoWorkEventHandler

Clase EnumConverter

Clase EventDescriptor

Clase EventDescriptorCollection

Clase EventHandlerList

Clase ExpandableObjectConverter

Clase HandledEventArgs

DelegadoHandledEventHandler

Clase InstanceCreationEditor

Clase Int16Converter

Clase Int32Converter

Clase Int64Converter

Clase InvalidAsynchronousStateException

Clase InvalidEnumArgumentException

Método BeginInvoke

Clase License

Clase LicenseContext

Clase LicenseException

Clase LicenseManager

Clase LicenseProvider

Clase LicFileLicenseProvider

Clase ListChangedEventArgs

DelegadoListChangedEventHandler

Clase ListSortDescription

Clase ListSortDescriptionCollection

Clase MaskedTextProvider

Clase MemberDescriptor

Clase MultilineStringConverter

Clase NestedContainer

Clase NullableConverter

Clase ProgressChangedEventArgs

DelegadoProgressChangedEventHandler

Clase PropertyChangedEventArgs

DelegadoPropertyChangedEventHandler

Clase PropertyDescriptor

Clase PropertyDescriptorCollection

Clase ReferenceConverter

Clase RefreshEventArgs

DelegadoRefreshEventHandler

Clase RunWorkerCompletedEventArgs

DelegadoRunWorkerCompletedEventHandler

Clase 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
System.Diagnostics Propiedad Debug.Listeners

Propiedad Trace.Listeners

Propiedad EventLog.SynchronizingObject

Clase ConsoleTraceListener

Clase DefaultTraceListener

Clase DelimitedListTraceListener

Clase EventLogTraceListener

Clase PerformanceCounter

Clase PerformanceCounterCategory

Clase Process

Clase ProcessStartInfo

Clase TextWriterTraceListener

Clase TraceListener

Clase XmlWriterTraceListener

Propiedad TraceSource.Listeners
System.IO Método Stream.Synchronized

Método TextReader.Synchronized

Método TextWriter.Synchronized
System.Reflection.Emit Clase ConstructorBuilder

Clase EventBuilder

Clase FieldBuilder

Clase MethodBuilder

Clase CustomAttributeBuilder

Clase MethodRental

Clase ModuleBuilder

Clase PropertyBuilder

Clase TypeBuilder

Clase UnmanagedMarshal
System.Text Método Group.Synchronized

Método Match.Synchronized
System.Threading Clase AutoResetEvent

Clase EventWaitHandle

Clase ManualResetEvent

Clase Monitor

Clase Mutex

Clase ReaderWriterLock

Clase Semaphore

Método Thread.AllocateNamedDataSlot

Método Thread.BeginCriticalRegion

Método Thread.EndCriticalRegion

Método Thread.FreeNamedDataSlot

Método Thread.GetData

Método Thread.Join

Método Thread.SetApartmentState

Método Thread.SetData

Método Thread.SpinWait

Método Thread.Start

Método Thread.TrySetApartmentState

Clase ThreadPool

Clase Timer
System.Timers Clase Timer
System.Web.Configuration Clase MachineKeyValidationConverter
System.Windows.Forms Propiedad AutoCompleteStringCollection.SyncRoot

Conjuntos de permisos de SQL Server

SQL Server permite a los usuarios especificar los requisitos de confiabilidad del código implementado en una base de datos. Al cargar 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 EXTERNAL-ACCESS UNSAFE
Seguridad de acceso del código Solo ejecución Ejecución + acceso a recursos externos Sin restricciones
Restricciones del modelo de programación Sin restricciones
Requisito de capacidad de comprobación 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 dispone de características de seguridad y de gran confiabilidad. Los ensamblados SAFE tienen permisos suficientes para la ejecución, realización de cálculos y obtención de acceso a la base de datos local. Los ensamblados SAFE deben tener capacidad para comprobar la seguridad de los tipos y no pueden llamar a código no administrado.

EXTERNAL-ACCESS proporciona una opción de seguridad intermedia y permite que el código obtenga acceso a los recursos externos a la base de datos, pero manteniendo la confiabilidad y la seguridad de SAFE.

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

SQL Server usa la capa de directiva de seguridad de acceso del código del nivel de host para configurar una directiva de host que conceda uno de los tres conjuntos de permisos según 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 del código administrado de SQL Server requiere funciones, procedimientos y tipos que no requieren el uso del estado mantenido en varias invocaciones ni del estado compartido en 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.

Dadas estas consideraciones, SQL Server no permite el uso de variables estáticas ni de miembros de datos estáticos. En cuanto a los ensamblados SAFE y EXTERNAL-ACCESS, SQL Server examina los metadatos del ensamblado al crear el ensamblado (CREATE ASSEMBLY). Se produce un error al crear dichos ensamblados si encuentra el uso de variables y miembros de datos estáticos.

Consulte también