Inicio Seguridad Como evitar SQL Injection en nuestra consultas PHP/MySQL

Como evitar SQL Injection en nuestra consultas PHP/MySQL

15 1508

SQL Injection (esp. Inyección SQL) se define como:

[...] una vulnerabilidad informática en el nivel de la validación de las entradas a la base de datos de una aplicación. El origen es el filtrado incorrecto de las variables utilizadas en las partes del programa con código SQL. Es, de hecho, un error de una clase más general de vulnerabilidades que puede ocurrir en cualquier lenguaje de programación o de script que esté incrustado dentro de otro. [...] – Wikipedia.

Pueden seguir leyendo en Wikipedia donde se explica detalladamente, incluso con ejemplos. Pero agrego mi aporte con estos ejemplos:

Una consulta vulnerable:

 
$query = "SELECT * FROM libros WHERE autor='$autor_nombre'";

mysql_query($query);

Usando mysql_escape_string para manejar como texto las comillas, y además sprintf para dar formato a la cadena.

 
$query = sprintf("SELECT * FROM libros WHERE autor='%s'",

mysql_real_escape_string($autor_nombre));

mysql_query($query);

Ahora si nuestra consulta trabaja con instrucciones como: LIKE, GRANT ó REVOKE. Esta es una forma más segura:

 
$query = sprintf("SELECT * FROM libros WHERE autor='%s'",

addcslashes(mysql_real_escape_string($autor_nombre),'%_'));

mysql_query($query);

addcslashes muestra una barra invertida antes de las caracteres definidos en el segundo parametro de esta función. 

Programador y Desarrollador Web. Administrador de RibosoMatic y Proyecto Yupy. Blogger y entusiasta de la tecnología, internet, software y tutoriales para desarrollo de aplicaciones para la web ....

15 COMENTARIOS

  1. En lo personal, creo que no es necesario el crear filtros para las consultas SQL en PHP, especialmente por que si se configura el php.ini correctamente con las magic quotes en on, el mismo sistema se encarga de filtrar las comillas agregandoles una slash.

    El problema del SQL Injection lo veo más que nada en ASP más que en PHP…

    Un saludo.

  2. Aparte de la validación javascript antes de enviar el formulario, Para evitar que los hackers inserten código no deseado hagan sql o email injection también es recomendable hacer una validacion en el lado del servidor. Recomiendo usar una función como esta:

    < ?php
    function ValidarDatos($campo){
    //Array con las posibles cadenas a utilizar por un hacker
    $CadenasProhibidas = array("Content-Type:",
    //evita email injection
    "MIME-Version:", "Content-Transfer-Encoding:","Return-path:","Subject:","From:","Envelope-to:","To:","bcc:","cc:",
    "UNION",
    // evita sql injection
    "DELETE","DROP","SELECT","INSERT","UPDATE","CRERATE","TRUNCATE","ALTER","INTO","DISTINCT","GROUP BY","WHERE","RENAME","DEFINE","UNDEFINE","PROMPT","ACCEPT","VIEW","COUNT","HAVING","'",'"',"{","}","[","]",
    // evita introducir direcciones web
    "HOTMAIL","WWW",".COM","@","W W W",". c o m","http://",
    //variables y comodines
    "$", "&","*");

    //Comprobamos que entre los datos no se encuentre alguna de
    //las cadenas del array. Si se encuentra alguna cadena se
    //dirige a la página anterior

    foreach($CadenasProhibidas as $valor){
    if(strpos(strtolower($campo), strtolower($valor)) !== false){
    echo("

    SOCIAL

    1,085FansLike