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!

Pingback: Consultas seguras a base de datos MySQL con PHP « DbRunas – Noticias y Recursos sobre Bases de Datos
Yo he estado usando esto : http://www.phpinsider.com/php/code/SafeSQL/