SQL injections en ejemplos

¿Que es un ataque SQL injection?

Los ataques mediante SQL injection se aprovechan de errores en la filtración de los datos que introduce el usuario de la web y permite al atacante hacerse el control de la aplicación.

Ejemplo práctico

Veamos una consulta básica, la identificación de un usuario en una web

$u=$_POST['usuario'];
$p=$_POST['password'];
SELECT * FROM users WHERE user='$u' AND password='$p'

Que pasaría si… conociendo que existe el usuario en el campo de contraseña introducimos ‘ OR »=’

SELECT * FROM users WHERE user='admin' AND password='' OR ''=''

Con esta consulta engañamos al sistema ya que forzamos una comparación de «nada» es igual a «nada» lo que nos da acceso al sistema.

Al igual que la anterior consulta se pueden intentar inyectar unas cuantas más forzando comparaciones simples (OR 1=1) o intentando comentar el código con «//» o «/* */»

¿Como prevenir estos ataques?

Hay medidas que los programadores deben tomar en cuenta a la hora de diseñar sus scripts. Un buen comienzo es filtrar las consultas con mysql_real_escape_string()

$u=mysql_real_escape_string($_POST['usuario']);
$p=mysql_real_escape_string($_POST['password']);
SELECT * FROM users WHERE user='$u' AND password='$p'

mysql_real_escape_string() llama a la función de la biblioteca MySQL mysql_real_escape_string, la cual coloca barras invertidas antes de los siguientes caracteres: \x00, \n, \r, \, ‘, » y \x1a

Notas

  • Es necesaria una conexión MySQL antes de usar esta función o devolverá WARNING
  • Si está habilitado magic_quotes_gpc debe aplicarse stripslashes() sobre las variables primero
  • Esta función no escapa « ni «
1 comentario

Dejar un comentario

¿Quieres unirte a la conversación?
Siéntete libre de contribuir!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *