Considerando un procedimiento genérico almacenado que está sujeto a la inyección de SQL:
CREATE PROC usp_badproc
@sql NVARCHAR(8000)
AS BEGIN
EXEC(@sql)
END
y operando bajo los supuestos de que
- el proceso solo lee datos,
- el contexto operativo tiene acceso a otros recursos y métodos, incluidos
UPDATE
yDELETE
en tablas sensibles (por ejemplo,dbo.Users
odbo.CreditCards
), - no se puede cambiar la firma del proceso
- el contexto de ejecución del proceso no se puede cambiar
¿cuáles son los pros y los contras para mejorar este procedimiento como:
CREATE PROC usp_badproc
@sql NVARCHAR(8000)
AS BEGIN
BEGIN TRANSACTION
EXEC(@sql)
ROLLBACK TRANSACTION
END
Es decir, envolver la ejecución en una transacción y revertirla siempre.
Comprendo que, en esencia, solo está reduciendo el nivel del problema (por ejemplo, @sql ahora tiene que terminar con COMMIT TRANSACTION
), pero ¿agrega algún beneficio, incluso desde una perspectiva reactiva / de registro? ¿Se puede marcar la transacción de una manera que nunca sea recuperable?
Para ser claros, nunca sugeriría esto como una solución a un riesgo de inyección de SQL, solo estoy tratando de entenderlo mejor y las capas involucradas.