Discussion:
validar datos para evitar inyección sql
(demasiado antiguo para responder)
bogal
2007-03-11 11:14:05 UTC
Permalink
Hola

Me gustaría saber formas de evitar ataques com inyección sql mediante
validación de datos. Que no deje entrar datos como '<','drop'...

¿Alguna función o expresión regular o fórmula habrá para hacerme una idea?

Gracias de antemano
Marcos Mellibovsky
2007-03-11 13:14:48 UTC
Permalink
Hola bogal,
Para evitar sql Injection, en lugar de validar todos los campos, te conviene
tomar como regla no usar el contenido ingresado por el usuario para armar
sentencias sql. Esto no significa que no puedas armar sentencias
dinamicamente. Si queres usar sentencias dinamicas podes hacerlo
parametrizandolas asi:

SELECT * FROM Tabla WHERE Campo1 = @Param1 AND Campo2 = @param2

Luego asignas los valores a utilizar en cada parametro (?) con

cmd.Parameters.AddWithValue("@Param1", txtPAram1.Text);

De esta manera, ademas de estar mas seguro, mejoras la performance porque el
motor puede cachear la compilacion de la sentencia ya que no varia de una
ejecución a otra, solo varian los parametros. Cada vez que ejecutas una
sentencia sql el motor recibe un texto que primero compila y luego ejecuta.
Si el texto es el mismo de una ejecución anterior se evita compilarlo
nuevamente.

El @ para sql server, en otros casos va un signo de pregunta para definir un
parametro Campo1 = ?. Esto varia de un motor a otro

Otra ventaja adicional que obtenes de esta manera es que podes evitar que el
motor haga conversiones de tipos, que suele ser una fuente de errores. Por
ejemplo, si tenes tu apliacion configurada para funcionar todo en castellano
y tu base usuario de base de datos esta en ingles, si le pasas el texto de
una fecha al motor te la puede tomar al reves. Trabajando de esta manera
podes, en lugar de pasarle un texto de una fecha, le podes pasar un DAteTime

cmd.Parameters.AddWithValue("@Param1", DateTime.Parse(txtPAram1.Text));

Asi al hacer las conversiones de tipo solo en tu aplicacion podes evitar
errores

y sino directamente usa procedimientos almacenados
--
Saludos
Marcos Mellibovsky
MCT MCTS MCSD.NET MCDBA MCSE...
Cordoba Argentina
Post by bogal
Hola
Me gustaría saber formas de evitar ataques com inyección sql mediante
validación de datos. Que no deje entrar datos como '<','drop'...
¿Alguna función o expresión regular o fórmula habrá para hacerme una idea?
Gracias de antemano
bogal
2007-03-11 13:42:00 UTC
Permalink
Hola

Muchísimas gracias. Muy amable. Me quedó muy claro, aunque antes estaba algo
remiso a esta solución, ya que el usuario malintencionado puede introducir un
texto como ';drop table tabla'. Entonces es de suponer que no hay peligro, ya
que se guarda como un valor. Y debería parametrizar todas las consultas, ya
que si le paso el valor guardado en este caso, me ejecuta el drop.

¿No hay ningún peligro entonces?

Gracias de nuevo
Luis Ruiz Pavón
2007-03-11 17:58:13 UTC
Permalink
Utilizando consultas parametrizadas o procedimientos almacenados evitas
ataques de injección SQL en tu base de datos.

Salu2.

MCP
Optima Global Solutions
Web: http:www.dotnetalia.com
Blog: http://geeks.ms/blogs/lruiz
Post by bogal
Hola
Muchísimas gracias. Muy amable. Me quedó muy claro, aunque antes estaba algo
remiso a esta solución, ya que el usuario malintencionado puede introducir un
texto como ';drop table tabla'. Entonces es de suponer que no hay peligro, ya
que se guarda como un valor. Y debería parametrizar todas las consultas, ya
que si le paso el valor guardado en este caso, me ejecuta el drop.
¿No hay ningún peligro entonces?
Gracias de nuevo
Marcos Mellibovsky
2007-03-11 19:33:42 UTC
Permalink
exacto, no hay problemas si parametrizas las consultas
--
Saludos
Marcos Mellibovsky
MCT MCTS MCSD.NET MCDBA MCSE...
Cordoba Argentina
Post by bogal
Hola
Muchísimas gracias. Muy amable. Me quedó muy claro, aunque antes estaba algo
remiso a esta solución, ya que el usuario malintencionado puede introducir un
texto como ';drop table tabla'. Entonces es de suponer que no hay peligro, ya
que se guarda como un valor. Y debería parametrizar todas las consultas, ya
que si le paso el valor guardado en este caso, me ejecuta el drop.
¿No hay ningún peligro entonces?
Gracias de nuevo
Jose A. Fernandez
2007-03-11 22:31:33 UTC
Permalink
Hola a todos...
me sumo al post
Agregando que no solo hayq ue ver los datos que se "envian a nuestra
DV", sino tambien por ejemplo se manipula en el server y es cargado
desde el browser del visitante.
Aqui tenemos "Script Attacks" o sea la insercion de codigo HTML de
scripting, por ejemplo en iun textbox que luego se envia por email, o
sea no solo cuidarnos de sql malicioso sino de cualquier entrada por
parte del usuario.
Ejemplo en un articulo:
http://www.asp.net/faq/RequestValidation.aspx

por suerte desde asp.net 1.1 y 2.0 tenemos el "Request Validation"
cualquier elemento reservado (por ejemplo codigo HTML) en los envios
hacia el servidor, previniendo la insercion de script.


Otros enlaces interesantes:
- How To: Protect From Injection Attacks in ASP.NET
http://msdn2.microsoft.com/en-us/library/bb355989.aspx
y otro enlace para el post
- How To: Protect From SQL Injection in ASP.NET
http://msdn2.microsoft.com/en-us/library/ms998271.aspx

- Security Guidelines: ASP.NET 2.0
http://msdn2.microsoft.com/en-us/library/ms998258.aspx

Espero que les sirva de ayuda o guia
_________________________
Jose A. Fernandez
Post by Marcos Mellibovsky
exacto, no hay problemas si parametrizas las consultas
--
Saludos
Marcos Mellibovsky
MCT MCTS MCSD.NET MCDBA MCSE...
Cordoba Argentina
Post by bogal
Hola
Muchísimas gracias. Muy amable. Me quedó muy claro, aunque antes estaba algo
remiso a esta solución, ya que el usuario malintencionado puede introducir un
texto como ';drop table tabla'. Entonces es de suponer que no hay peligro, ya
que se guarda como un valor. Y debería parametrizar todas las consultas, ya
que si le paso el valor guardado en este caso, me ejecuta el drop.
¿No hay ningún peligro entonces?
Gracias de nuevo- Ocultar texto de la cita -
- Mostrar texto de la cita -
Continúe leyendo en narkive:
Loading...