martes, 24 de mayo de 2016

77. sql EXEC master..xp_cmdshell ¿Usarlo?

Ya ha pasado un rato que no he escrito, una disculpa, múltiples actividades redujeron un poco mi tiempo, pero eso no quiere decir que me he olvidado de este proyecto.

La siguiente es una opinión mía, basada únicamente en mi experiencia es posible que no la compartan pero ese es el punto principal de la creación de un blog, incitar al debate.

En este caso hablaremos de xp_cmdshell, que nos sirve para hacer llamadas al sistema operativo desde un store procedure de la base de datos.

Si bien esto nos dota de una herramienta muy poderosa ya que nos permite la interacción con procesos externos, abre algunas puertas para poder ejecutar comando no deseados en el sistema operativo, y he aquí una de las grandes debilidades, si se tiene una mala codificación, este comando podría permitir una inyección de código directo al sistema operativo, que se ejecutaría con un usuario que tiene los privilegios del usuario de la base de datos, o del store procedure en cuestión.

Bueno esto siempre puede ser contenido, limitando los privilegios de acceso, evitando enviar concatenaciones a este comando que se puedan manipular desde afuera.

Sin embargo la puerta esta abierta.

Yo soy firme creyente de que el motor de base de datos no se debe sobrecargar, y sobrecargar el equipo en el que se encuentra dicho motor tampoco es buena idea, el uso de este comando hace que las acciones que se ejecutan sobre sistema operativo, o con un programa externo se ejecuten en el mismo equipo en el que se encuentra la base de datos, si hablo de una base de datos productiva en la que me interesa que el servidor en el que se encuentra la base se dedique solo a administrar la base, es un grave error quitarle recursos.

Los StorePorcedures no deben tener una lógica de negocio complicada, por que todo lo que se haga en ellos se hace en el servidor de base de datos, y repercute contra la cantidad de operaciones en paralelo que nuestro servidor sea capas de resolver, todos los accesos a base de datos deben ser rápidos, no deben tomar periodos de tiempo prolongados por que esto genera que las operaciones a la base se empiecen a encolar.

Cuando invocamos una llamada al sistema operativo desde el motor, este permanece a la espera de que el sistema operativo termine su proceso, empleando un hilo de la base de datos que se encuentra ocupado, pero sin una actividad real.

Una llamada al sistema operativo no puede ser cancelada desde la base de datos, imaginemos que hacemos una llamada a un proceso que consume gran cantidad de recursos, puede incluso provocar que nuestra base de datos se detenga, y aun si la cancelamos desde SQL, el proceso se cancelara hasta que la llamada al Sistema operativo termine, como consecuencia solo podremos cancelarlo desde el servidor mismo.

En mi opinión, usar una llamada a sistema operativo, desde la base de datos, si es posible pero siempre y cuando se valoren los pros y contras de la misma, yo en lo personal prefiero no usarla.

Felices lineas.