Inicio > Curso básico de SQL Server 2008 > Sql dinamico y contexto de seguridad – Sql Server 2008

Sql dinamico y contexto de seguridad – Sql Server 2008


El SQL-dinámico es una técnica por la cual se nos permite ejecutar sentencias TSQL de forma dinámica,  para poder hacer uso de esta es necesario utilizar o bien el store procedure sp_executesql o sino un EXEC(@str).

Una de las mayores contras que tiene el uso de SQL-Dinámico es que si lo ponemos dentro de un Store Procedure el usuario que ejecute tal Store no solo deberá tener permisos de execute sino que también deberá tener permisos sobre los objetos que haga referencia el SQL-Dinámico

——————————————————————
— Sql dinamico , contexto de seguridad
——————————————————————
USE Pruebas
GO

– Creamos un nuevo login
CREATE LOGIN Ricardo WITH PASSWORD =’Passw@rd’
GO

– Creamos el usuario en la base de datos
CREATE USER Ricardo
GO

– Creamos una nueva tabla
CREATE TABLE dbo.Clientes (Id_Cliente INT IDENTITY, Nombre VARCHAR(80))
GO

INSERT INTO dbo.Clientes VALUES(‘JUAN AVILA’)
INSERT INTO dbo.Clientes VALUES(‘ALDO LADERAS’)
INSERT INTO dbo.Clientes VALUES(‘VICTOR MORENO’)

– Creamos un SP que utiliza la tabla Clienetes
CREATE PROC dbo.SPClientesSelect AS
 SELECT * FROM dbo.Clientes
GO

– Creamos otro SP que utiliza la tabla pero con SqlDinamico
CREATE PROC dbo.SPClienetesSelectDinamico AS
 DECLARE @SqlDinamico NVARCHAR(50)
 SET @SqlDinamico = N’SELECT * FROM dbo.Clientes’
 EXECUTE SP_EXECUTESQL @SqlDinamico
GO

– Ricardo solo tiene permisos a los SP
GRANT EXECUTE ON dbo.SPClientesSelect TO Ricardo
GRANT EXECUTE ON dbo.SPClienetesSelectDinamico TO Ricardo
GO

– Entramos como Ricardo
EXECUTE AS LOGIN = ‘Ricardo’

SELECT ()SUSER_SNAME
SELECT * FROM dbo.Clientes – No funciona por carecer de permisos
EXEC dbo.SPClientesSelect – Funciona
EXEC dbo.SPClienetesSelectDinamico – No funciona por carecer por ser SqlDinamico
REVERT – Revertimos el login
SELECT SUSER_SNAME()

——————————————————————
— Sql dinamico y contexto de seguridad
— Cambiamos el SP del SqlDinamico para que ejecute en otro contexto de seguridad
——————————————————————

ALTER PROC dbo.SPClienetesSelectDinamico
WITH EXECUTE AS OWNER
AS

DECLARE @SqlDinamico NVARCHAR(50)
SET @SqlDinamico = N’SELECT * FROM dbo.Clientes’

EXECUTE SP_EXECUTESQL @SqlDinamico
GO

– Volvemos a probar
EXECUTE AS LOGIN = ‘Ricardo’

SELECT SUSER_SNAME()
SELECT * FROM dbo.Clientes  – No funciona por carecer de permisos
EXEC dbo.SPClientesSelect  — Funciona
EXEC dbo.SPClienetesSelectDinamico – Funciona

REVERT – Revertimos el login
SELECT SUSER_SNAME()

About these ads
  1. 23 agosto 2011 en 12:11 pm

    Lo más preocupante, es que hay que conceder los permisos necesarios de acceso, y hay que realizar validaciones de caracteres en el @sqldinámico, sino, nos regalamos para una injección–

    • 23 agosto 2011 en 12:16 pm

      perdon, el exec posibilita aun más una injección… una consulta dinámica, al menos nos permite parametrizar la entrada,

      • 15 diciembre 2011 en 12:38 pm

        Asi es.

        Saludos
        Ricardo

    • 5 abril 2013 en 9:54 pm

      Asi es …

  1. No trackbacks yet.

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

A %d blogueros les gusta esto: