Consultas seguras a base de datos MySQL con PHP

Hace tiempo estuve buscando con unos amigos la mejor manera de realizar consultas a una base de datos MySQL desde PHP sin sufrir demasiado con el SQL Injection. Encontré varias técnicas recomendadas:

  • Crear las consultas empleando la función sprintf para convertir los parámetros a String. Un ejemplo de uso de esta función sería:
    $query = sprintf("SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET %d;" $offset);
  • Usar mysql_real_escape_string para escapar caracteres  ”raros” que no deban aparecer en una consulta. Un ejemplo de su uso sería:
    $query = "select * from usuarios where name = '". mysql_real_escape_string($_POST['user'])."' and pass = '".mysql_real_escape_string($_POST['pass'])."' LIMIT 1";
  • Si usamos en nuestras consultas LIKE, GRANT o REVOKE en conveniente usar la función addcslashes, para colocar barras invertidas delante de algunos caracteres y escaparlos. Se usa así:
    addcslashes($autor_nombre,'%_'));

El resultado de combinar estas tres técnicas sería una consulta como esta:

$query = sprintf("SELECT * FROM libros WHERE autor='%s';", addcslashes(mysql_real_escape_string($autor_nombre),'%_'));

Nosotros acabamos juntando esto en una función así  (sacada de PHP.net):

function secure_query($query,$params = false) {
    if ($params) {
        foreach ($params as &$v) { $v = addcslashes(mysql_real_escape_string($v),'%_'; }
        $sql_query = vsprintf( str_replace("?","'%s'",$query), $params );
        $sql_query = mysql_query($sql_query);
    } else {
        $sql_query = mysql_query($query);
    }
    return ($sql_query);
}

Para usarla hay que pasarle por parámetros una cadena con la consulta en la que se use ? en el lugar que deberían ocupar las variables y un array con los valores de estas ordenados por orden de aparición, por ejemplo…

secure_query("SELECT * FROM persona WHERE nombre = ? AND apellidos = ?;",  array($nombre, $apellidos));

Espero que le sirva a alguien, y si encontráis algún problema o algo mejor dejar un comentario!

Esta entrada fue publicada en Desarrollo web, Seguridad y etiquetada , , , , , , , , , , , , , . Guarda el enlace permanente.

2 respuestas a Consultas seguras a base de datos MySQL con PHP

  1. Pingback: Consultas seguras a base de datos MySQL con PHP « DbRunas – Noticias y Recursos sobre Bases de Datos

Deja un comentario

Tu dirección de correo electrónico no será publicada.

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">