En este tutorial os contamos cómo evitar uno de los ataques mas frecuentes de los hackers: La inyección SQL.
Os vamos a mostrar 3 scripts de PHP que nos van a permitir conocer la forma en que podemos evitar una inyección SQL por parte de posibles atacantes.
Para ello revisemos primero este primer script y analicemos
<?php
$query = "SELECT *
FROM users
WHERE name = '{$_GET['name']}'";
?>
Este script puede ser fácilmente vulnerable porque directamente agrega el valor de la variable ‘name’ a la sentencia SQL. Como puede ver permite para que el atacante agregue lo que desee y pueda comprometer nuestros datos.
Otra opción, aunque no muy recomendable sería la que se muestra debajo. En esta opción primero se verifica que los caracteres de la variable ‘name’ sean numéricos, luego se escapan los caracteres especiales haciendo uso de la función de php llamada mysql_real_escape_string. Por último se construye la sentencia SQL haciendo uso de los datos ya tratados previamente.
<?php
// Inicializar arreglos para datos filtrados y escapados, respectivamente.
$clean = array();
$sql = array();
// Filtra el nombre. Solo caracteres alfabéticos.
if (ctype_alpha($_GET['name'])) {
$clean['name'] = $_GET['name'];
} else {
// El nombre es inválido. Se debe tomar una acción aquí.
}
// Escapar el nombre
$sql['name'] = mysql_real_escape_string($clean['name']);
// Construir la consulta
$query = "SELECT *
FROM users
WHERE name = '{$sql['name']}'";
?>
La última opción –la preferida– se muestra debajo. En ella simplemente se transfiere a PHP y MySQL la tarea de verificar la sentencia SQL. Se hace uso del método prepare de la clase PDO para preparar la sentencia y de execute para ejecutarla. Notemos el uso de los dos puntos antes de ‘name’ en la preparación de la sentencia y en la ejecución de la misma. Estos son requisitos que no podemos omitir.
<?php
// Creando el formato de la consulta
$query = $db->prepare('SELECT *
FROM users
WHERE name = :name');
// Indicando los datos
$query->execute(array(':name' => $clean['name']));
?>
