systemadmin.es » SQL Injection no solo trata de comillas

SQL Injection no solo trata de comillas

Aunque estrictamente no se trata de un tema de sistemas, no es de extrañar que alguien pregunte estos temas. Por ejemplo, ayer me encontré con un programador que asociaba SQL Injection (un problema que tuvo en la base de datos) con las comillas: “Ya escapo las comillas

Revisando el código (PHP) encontré que hacia una diferenciación según el tipo de datos. En el caso de añadir un string a la query el código era:

$query.=" variable = '".mysql_real_escape_string($var)."'";

Mientras que si la variable era un identificador numérico:

$query.=" variable = ".mysql_real_escape_string($var);

En el caso que la variable en lugar del valor numérico contenga lo siguiente:

3; drop database ejemplo;

La query se construiría de la siguiente forma:

select name from users where variable=3; drop database ejemplo;

En este caso sólo usando comillas también para datos numéricos tendríamos un problema menos porque la query se construiría de la siguiente forma (dando un error al ejecutarse):

select name from users where variable='3; drop database ejemplo;'

SQL Injection realmente es una técnica genérica referida a añadir código SQL y no “usar comillas para hacer cosas malas

Relacionados

Imprimir Imprimir

10 comments to “SQL Injection no solo trata de comillas”

  1. Cuidado! se te ha colado un “tubo” en el primer párrafo.

    Saludos.

    Jordi Prats:

    Corregido, muchas gracias! Ese tubo debería darme en la cabeza

  2. Debería estar pensando en algún bash script con pipes :-)

    Jordi Prats:

    xD seguramente

  3. Hola, muy bueno el articulo, ahora te falta la segunda parte.

    ¿Que tecnicas recomiendas para solventar este problema?

    Jordi Prats:

    Para este caso concreto, lo comento al final de todo, simplemente se deben usar comillas también para los números.

    saludos!

  4. También puede ser interesante verificar con is_numeric() la variable. A veces mostrar un error de sql “near xxxx” revela parte de la consulta y no interesa.
    Buen artículo, gracias.

    Jordi Prats:

    Desde luego, cuanto más filtros añadamos mejor.

  5. Lo mejor, la mejor solución es intentar buscar (e impedir) caracteres en blanco: (en PHP)

    strrpos - Encuentra la posición de la última ocurrencia de un caracter en una cadena

    Descripción:
    strrpos int (string $pajar, string $aguja [, int $offset])

    Ejemplo…

    0) $stop = “”._NICKNOSPACES.”";

    Jordi Prats:

    Creo que aún lo puedes restringir mejor con is_numeric() para este caso:

    $variable=(isset($POST['dl'])&&is_numeric($_POST['dl'])) ? $_POST['dl'] : 0;
    

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>