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

SQL Injection en ASP

Es común en nuestros ASP usar lo que el usuario pone en un formulario para montar una consulta SQL (contra una base de datos Access o SQL Server). Por ejemplo, una típica pagina de validación de usuario y contraseña tendría esta pinta:

<%
usuario=request.form("usuario")
pass=request.form("pass")

sql="SELECT * FROM usuarios WHERE user='" & usuario & "' and pw='" & pass & "'"
  .... y abrir un recordset sobre ese SQL
  .... para comprobar si existe el usuario tecleado
%>

El problema es que pasamos al motor de SQL la cadena que tecleo el usuario, tal y como la tecleó el usuario.

SQL Injection es una tecnica de ataque que consiste en aprovecharse de esto. De entrada parece algo "tonto" que tecleando cosas ahí puedan modificar nuestra base de datos o conseguir acceso a zonas restringidas de nuestro web. Pero supongamos en el caso anterior que por ejemplo la cadena tecleada fuera:

usuario:" a' or true "
pass : " a' or true "

La cadena resultado sería

SELECT * FROM usuarios WHERE user='a' or true and pass='a' or true

Y esto ya no suena tan bien.

Hay cosas peores; pueden llegar a inyectar un comando SQL ( DROP , UPDATE , etc.) que modifique realmente nuestra base de datos, o incluso sacar nombres y passwords reales de la misma.

No voy a entrar en profundidad en "lo que nos podrían hacer" sino en como evitarlo:

Tenemos que tener cuidado en todos los parámetros recogidos por formulario (o querystring ) que vayan a formar parte de una consulta SQL, sobre todo en apartados críticos como la validación de usuarios, pero en general en todas partes.

Realmente lo que tenemos que evitar es que, al formar la cadena SQL, ésta tenga un "sentido" distinto al esperado. Para ello, una vez leído el parámetro, debemos tratarlo antes de meterlo en la SQL , quitándole cosas peligrosas.

Por ejemplo:

<%
usuario=request.form("usuario")
pass=request.form("pass")
usuario=limpia(usuario)
pass=limpia(pass)
sql="select * from usuarios where user='" & usuario & "' and pw='" & pass & "'"

....
funcion limpia(t)
dim tt
  tt=t
  tt=replace(tt,"""","")
  tt=replace(tt,"'","")
  tt=replace(tt,"--","")
  ' convendria tambien un
  tt=server.htmlencode(tt)
limpia=tt
end funcion
%>

Se puede (y se debe) mejorar mucho esa funcion, pues dependiendo de nuestro ASP en muchas ocasiones deberemos eliminar también palabras como DELETE , UPDATE , DROP , etc.. Para ampliar conocimientos sobre este tema recomiendo la lectura del documento de Chris Anley

Artículo original de Gabriel Calles
www.programacion.com



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

- ASP Email
- Crear Recordsets XML con ASP
- Reconocer idioma del visitante en ASP
- Historia de ASP
- Bloquear acceso por direccion IP


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 24-05-2012 a las 13:17:30