Prevención de ataques de inyección SQL en PHP y MySQL

Un punto muy importante en la seguridad de un sitio web que trabaja interactuando con bases de datos, es prevenir la inyección de sentencias SQL en los formularios de la página. Explicaré como evitarlo mediante el uso de una función de las librerías de MySQL en PHP.

Los ataques mediante inyección de SQL consisten en ingresar en los campos de los formularios de la página que deben ser evaluados por el sitio, textos que completan o modifican una sentencia SQL de las reglas de negocio de una web.Por ejemplo:

<?php
/* Verificamos en la base de datos el usuario y la contraseña para ingresar al portal.*/

$consulta "SELECT * FROM usuarios WHERE usuario='{$_POST['usuario']}' AND password='{$_POST['password']}'";
mysql_query($consulta);

?>

Que pasa si no revisamos la cadena de texto que viene por POST y por ejemplo contienen el siguiente texto:

<?php

$_POST['usuario'] = 'pepe';
$_POST['password'] = "' OR ''='";

?>

La sentencia resultante con la que el sistema validaría el inicio de sesión sería la siguiente:

SELECT * FROM usuarios WHERE usuario='pepe' AND password='' OR ''=''

Esto permitiría que cualquiera iniciara una sesión sin una contraseña válida.

La función que pertenece a la libreria mysql de php que nos evitaría muchísimos dolores de cabeza es:

string mysql_real_escape_string ( string cadena [, resource id_enlace] )

Esta función devuelve una cadena con los caracteres \x00, \n, \r, \, ', " y \x1a
escapados, es decir, cada vez que se encuentra un carácter de ese tipo, le antepone una barra invertida con el fin de anular el efecto del mismo.
Con lo cual las variables POST anteriores quedarían de la siguiente forma:
<?php 

$_POST['usuario'] = mysql_real_escape_string($_POST['usuario']);
$_POST['password'] = mysql_real_escape_string($_POST['password']);

?>
De esta forma obtenemos las variables con todos los caracteres “peligrosos” omitidos y es seguro efectuar una consulta a la base de datos.

Saludos, Geroman. 😉

Publicado en Informática
6 Comentarios en “Prevención de ataques de inyección SQL en PHP y MySQL
  1. RODRIGO ZURITA dice:

    EXCELENTE GUIA JUSTO LO QUE NECESITABA

  2. alfredo ramirez dice:

    GRACIAS…. PODRIAS ENVIARME UN EJEMPLO COMPLETO DE UN SCRIPT CON CANEXION A BASE DE DATOS UTILIZANDO FUNCION SELECT) MEDIANTE SESION DE PHP. bASE DE DATOS A NIVEL DE SERVIDOR,,, NO LOCAL HOST… TE LO AGRADECERIA….

  3. albert dice:

    no tienes un ejemplo de como qedaria en el query?

  4. maraiah dice:

    hola.esta exelente. podrias, si eres tan amable, decirme como aplicar esa sentencia dentro de esta esta clase conexion para que me funcione. ya que lo he estado intentando pero no me funciona.
    grasias

    host=’localhost’;
    $this->user=’root’;
    $this->password=”;
    $this->base_datos=’db_ensyo2′;
    $this->port = 3306;
    if($this->conection= mysql_pconnect($this->host,$this->user, $this->password) or trigger_error(mysql_error(),E_USER_ERROR)){
    mysql_select_db($this->base_datos);
    return true;
    }else {
    return false;
    }
    }

    /**
    * Sirve para ejecutar la consulta en la base de datos
    *
    * @param Dataset $query Contiene el resultado del dataset de la consulta
    */
    public function query($query){
    return $this->result= mysql_query($query,$this->conection);
    }

    public function num_rows(){
    return mysql_num_rows($this->result);
    }

    public function fetch_array(){
    return mysql_fetch_array($this->result);
    }

    public function affected_rows(){
    return mysql_affected_rows($this->result);
    }

    public function Close(){
    return mysql_close($this->conection);
    }

    }
    ?>

  5. thanks by the apport i wanna try with those functions into my script i need protected versus the injection is kind of attack us our web site,

    Saludos desde Envigado, Tierra de Don Pablo Emilio Escobar Gabidia, que descanze en paz.

  6. kalel dice:

    excelente aportacion amigo,no se puede mejor explicable

1 Pings/Trackbacks para "Prevención de ataques de inyección SQL en PHP y MySQL"
  1. […] que completan o modifican una sentencia SQL de las reglas de negocio de una web. Por ejemplo:Mas: http://www.geronet.com.ar/?p=47 […]

Deja un comentario

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

*

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.