viernes, abril 19, 2024

Convertir un Stored Procedure de Usuario a uno del Sistema en SQL Server 2000

En sistemas de información implementados con plataformas Cliente/Servidor, normalmente nos encontramos como mínimo con las tres capas básicas de estructuración, una arquitectura de aplicaciones con capas normalmente contiene código de presentación, código de procesamiento de datos y código de almacenamiento de datos (bases de datos), diferenciándose unos aplicativos de otros según la distribución del código, su implementación o su diseño interno.

Importante: este artículo fue escrito en el 2016, por lo que puede estar desactualizado.

La inteligencia del negocio puede ser integrada con la capa de presentación, la de programación o la de datos según los requerimientos del aplicativo, alcanzando ventajas significativas en velocidad, mantenimiento, flexibilidad, escalabilidad y reusabilidad. Algunos de estos aplicativos concentran la inteligencia y reglas del negocio en la capa de base de datos, utilizando procedimientos almacenados (stored procedures), funciones y vistas para manipular la información del sistema, convirtiendo a esta capa en el núcleo de procesamiento de los datos y por lo tanto en un punto critico de seguridad.

En Microsoft SQL Server 2000 es posible encriptar las vistas, funciones y procedimientos por medio de una instrucción sencilla [Encryption], pero al encriptar no es posible obtener la información que ejecuta el objeto. Este artículo brinda una herramienta con la cual convertir un procedimiento almacenado a un objeto del sistema, sin perder la información contenida en él.

Preparando la estructura de práctica
Con el fin de probar todos los puntos expuestos en este articulo se define un procedimiento almacenado en la base de datos de pruebas Northwind. Use northwind
Go

create procedure sp_leer_cliente
AS
begin
  select 
    CompanyName, ContactName, Phone, City
  from Customers
  where Region = 'OR'
end

Encriptación de Objetos
Con el procedimiento almacenado del sistema sp_helptext, se visualiza el texto contenido en un procedimiento almacenado, función, vista, regla, disparador(trigger), o default que no se encuentre encriptado. exec sp_helptext ‘sp_leer_cliente’

El comando ENCRYPTION de SQL Server 2000 permite encriptar el texto que define a un objeto tal como vistas, funciones, disparadores y procedimientos almacenados. Este comando oculta la informacion almacenada en la tabla del sistema SysComments y evita que sea parte de un proceso de replicación.

En el ejemplo siguiente se puede observar el efecto de encriptar el procedimiento almacenado sp_leer_cliente.

alter procedure sp_leer_cliente
WITH ENCRYPTION
AS
begin
  select 
    CompanyName,
    ContactName,
    Phone,
    City
  from Customers
  where Region = 'OR'
  end 

El resultado obtenido es: «The object comments have been encrypted.»

Convertir un Procedimiento Almacenado
Una manera inteligente de evitar que un usuario pueda modificar equivocadamente o convenientemente un procedimiento almacenado, es convertir un procedimiento almacenado de usuario a un procedimiento almacenado del sistema, estos últimos no pueden ser modificados a través del administrador corporativo de SQL Server, complicando la actualización de los procedimientos almacenados de este tipo, pero no evitando definitivamente que sea modificado.

Para realizar esta conversión seguiremos los siguientes pasos:

1. Modificar y desencriptar el procedimiento almacenado de prueba.

alter procedure sp_leer_cliente
AS
begin
select
CompanyName,
ContactName,
Phone,
City 
from Customers
where Region = 'OR'
end

2. Se determina el estado actual en el sistema del procedimiento almacenado, accediendo a la tabla del sistema Sysobjects. Para acceder directamente al registro que nos compete se filtran los datos que pertenezcan al conjunto de los procedimientos almacenados (xtype = ‘P’). select status, *
from sysobjects
Where name like ‘sp_leer_cliente’
and xtype = ‘P’ –procedure

Generalmente el estado(status) de un procedimiento almacenado de usuario es cero o un numero positivo (EJ: 1610612736). La idea general para realizar la conversión es convertir este estado a un valor negativo. Guardar el número de estado generado por esta consulta para devolver los cambios realizados en esta conversión.

3. Entre las opciones de configuración se encuentra la propiedad allow updates(permite actualizaciones), cuando el valor de esta propiedad es cero(0) no se permiten las actualizaciones de las tablas del sistema, sucediendo lo contrario cuando su valor es uno(1). Estas opciones se pueden cambiar utilizando el procedimiento almacenado del sistema sp_configure.

Se requiere ejecutar la sentencia RECONFIGURE with override después de cambiar cualquier valor de configuración, con el fin de actualizar los valores de configuración en ejecución asignando los nuevos valores. Aunque algunas opciones requieren reiniciar los servicios del servidor de base de datos.

sp_configure 'allow updates', 1 --1:Permite las actualizaciones
RECONFIGURE with override --Es necesario para que tome los cambios
EXEC sp_configure --Muestra las opciones
GO 

4. Actualizar el estado del procedimiento almacenado con un vor especifico:

Update sysobjects
Set status = -536870912
Where name like 'sp_leer_clnte'
and xtype = 'P' --procedure
GO 

5. Reconfigurar los valores estándar.

sp_confiure 'allow updates', 0 --0:No permite las actualizaciones
RECONFIGURE with override --Es necesario para que tome los cambios
EXEC sp_configure --Muestra las opciones
GO

6. Verificar a través del administrador corporativo que el procedimiento almacenado se comporta como un objeto del sistema.

Conclusión
Esta es una herramienta que busca brindar a los programadores de bases de datos SQL Server 2000 la posibilidad de bloquear sus objetos de bases de datos de una manera sencilla y cómoda a través de un script, sin generar trastornos a los usuarios. Aquí se brinda una solución práctica pero no definitiva a los problemas ocasionados por cambios realizados en la capa de base de datos por usuarios mal autorizados.

Descargar ejemplo: SPdelSistema_orig.zip

Roy Rojas
Roy Rojashttp://www.dotnetcr.com
Con más de 20 años de experiencia en programación, experto en lenguajes .NET, VB, C#, ASP.NET, Xamarin, XCode, DBA en SQL Server. Creador de dotnetcr.com, sitio web para programadores en español. royrojas.com | dotnetcr.com | GitHub
Roy Rojas
Roy Rojashttp://www.dotnetcr.com
Con más de 20 años de experiencia en programación, experto en lenguajes .NET, VB, C#, ASP.NET, Xamarin, XCode, DBA en SQL Server. Creador de dotnetcr.com, sitio web para programadores en español. royrojas.com | dotnetcr.com | GitHub