Está usted en Indice > Construcción > Lenguajes > ASP > Lecciones y Paso a Paso > Inyección SQL en ASP
Construcción
Maletín
Utilidades
Cursos
Promoción
Rentabilidad
Zona Novatos
Foros
Acceso a tu cuenta

Inyección SQL en ASP (2)

Y como esta sentencia nos devuelve un registro dejaremos que el usuario entre en la Web. Si el usuario escribe por ejemplo 'Admin' y de contraseña cualquier otra cosa, la sentencia no nos devolverá  registros y no permitiremos entrar a esa persona.
Pero ¿qué ocurre si el usuario escribe ' or '1'='1 como usuario y lo mismo de contraseña?
En este caso la variable Consulta contendrá la cadena:

"SELECT Count(*) FROM Usuarios WHERE Usuario = '' or '1'='1' 
AND password = '' or '1'='1'"

Y obviamente esta sentencia nos devuelve registros con lo que el usuario entrará en nuestra Web sin tener permiso.
Pero esto no es lo peor. Lo peor será que el usuario utilice estos trucos de inyección de SQL para ejecutar código arbitrario en nuestro servidor. Sentencias DDL, cambiar permisos, utilizar procedimientos almacenados y un largo etcétera. Qué ocurriría si alguien escribiese de contraseña cosas como:

' exec master..xp_cmdshell 'net user test /ADD' – 

Cómo evitarlo

Y ahora lo más importante, ¿qué podemos hacer para evitar estos errores?
Pues hay varios sistemas para evitarlo. Por ejemplo podemos filtrar las entradas de los usuarios reemplazando la aparición de ‘ por ‘’ (dos comillas simples) e incluso evitando que los usuarios puedan pasar caracteres como / “ ‘ o cualquier otro que se nos ocurra que puede causar problemas. Estos filtros pueden ser tan sencillos como utilizar la sentencia replace de Visual Basic:

SSQL= "SELECT count(*) FROM Usuarios WHERE Usuario = '" & Replace 
txtUsuario.Text, "'", "''") & "' AND password='" & Replace
(txtPassword.Text, "'", "''") & "'"

Otro factor importante en cuanto a la seguridad es limitar al máximo los permisos del usuario que ejecuta estas sentencias para evitar posibles problemas. Por ejemplo utilizando un usuario distinto para las sentencias SELECT, DELETE, UPDATE y asegurándonos que cada ejecución de una sentencia ejecute una sentencia del tipo permitido.
Por supuesto utilizar el usuario ‘sa’ o uno que pertenezca al rol ‘db_owner’ para ejecutar las sentencias de uso habitual de la base de datos debería quedar descartado.
Una solución definitiva sería trabajar con procedimientos almacenados. El modo en el que se pasan los parámetros a los procedimientos almacenados evita que la inyección SQL pueda ser usada. Por ejemplo utilizando el siguiente procedimiento almacenado:

CREATE  Procedure Validar @usuario varchar(50), @password varchar(50) AS
If (SELECT Count(*) FROM Usuarios WHERE Usuario=@Usuario
and Password=@password)>0
 Return 1
Return 0

También deberíamos validar los datos que introduce el usuario teniendo en cuenta por ejemplo la longitud de los campos y el tipo de datos aceptados. Esto lo podemos hacer en el cliente con los RegularExpressionValidator o con los CustomValidators del VB.NET. De todos modos si la seguridad es importante todas estas validaciones hay que repetirlas en el servidor.
Por ultimo, y ya que estamos pensando en entornos Web, podemos programar en ASP.NET y utilizar siempre que sea posible las clases System.Web.Security.FormsAuthentication para que los usuarios entren en nuestras aplicaciones Web.





Autor: Manivesa
http://sql.manivesa.com/Tutoriales+SQL/Programacion+.NET/150.aspx

Usuarios que han visto este tema también han visto...

- Paso de variables por URL con ASP
- Tres funciones útiles para fechas en ASP
- Subir ficheros
- Vaciar un Array con ASP
- Cinco pasos para iniciarse con ASP.NET


Versión imprimible - Versión imprimible de este documento
Enviar e-mail - Enviar por e-mail este documento
Publicidad






Cursos de Community Manager

Información legal | Política de Privacidad | Contacte con nosotros

Otro proyecto de Factoría de Internet. Copyright© 2003-2011 Factoría de Internet S.L.. Todos los derechos reservados.


Página generada el 25-05-2012 a las 10:44:54