Como comentábamos en la primera parte de este post, a continuación vamos a ver diferentes procedimientos para proteger nuestra aplicación web diseñada en PHP ante un posible ataque de inyección SQL.
Los diferentes procedimientos de protección ante un ataque de inyección SQL que vamos a ver son:
- Prepared statements. Los prepared statements son sentencias pre-compiladas que podemos definir en la programación de nuestras páginas en las que debemos indicar los parámetros que van a introducir los usuarios por medio de formularios. De esta manera tendremos la posibilidad de especificar a la base de datos, por un lado, el código que vamos a ejecutar, y por otra parte, las variables que vamos a utilizar. Así el motor de la base de datos será capaz de diferenciar los datos de entrada y evitar la inyección SQL. Un ejemplo de este tipo de procedimiento podría ser la siguiente función en la que se limpian los datos los datos introducidos por un usuario en un formulario:
<?php
$input_arr = array();
foreach ($_POST as $key => $input_arr)
{
$_POST[$key] = addslashes(limpiarCadena($input_arr));
}
$input_arr = array();
foreach ($_GET as $key => $input_arr)
{
$_GET[$key] = addslashes(limpiarCadena($input_arr));
}
function limpiarCadena($valor)
{
$valor = str_ireplace(“SELECT”,””,$valor);
$valor = str_ireplace(“COPY”,””,$valor);
$valor = str_ireplace(“DELETE”,””,$valor);
$valor = str_ireplace(“DROP”,””,$valor);
$valor = str_ireplace(“DUMP”,””,$valor);
$valor = str_ireplace(” OR “,””,$valor);
$valor = str_ireplace(“%”,””,$valor);
$valor = str_ireplace(“LIKE”,””,$valor);
$valor = str_ireplace(“–“,””,$valor);
$valor = str_ireplace(“^”,””,$valor);
$valor = str_ireplace(“[“,””,$valor);
$valor = str_ireplace(“]”,””,$valor);
$valor = str_ireplace(“\\”,””,$valor);
$valor = str_ireplace(“!”,””,$valor);
$valor = str_ireplace(“¡”,””,$valor);
$valor = str_ireplace(“?”,””,$valor);
$valor = str_ireplace(“=”,””,$valor);
$valor = str_ireplace(“&”,””,$valor);
return $valor;
}
?>
- Stored procedures. Los stored procedures son métodos predefinidos que tienen algunas clases específicas como por ejemplo la clase mysqli, que aporta el método prepare para evitar ataques de inyección SQL que puedan vulnerar la integridad de nuestra base de datos. Un ejemplo de funcionamiento de este tipo de procedimiento lo puedes encontrar a continuación:
<?
class bdcon {
protected $_db;
public function __construct() {
$this->_db = new mysqli ( DB_HOST, DB_USER, DB_PASS, DB_NAME );
if ($this->_db->connect_errno) {
echo “Fallo al conectar a MySQL: ” . $this->_db->connect_error;
return;
}
$this->_db->set_charset ( DB_CHARSET );
}
}
//Definiendo una conexión con mysqli, aparecen métodos predefinidos como prepare para evitar la injection SQL
$sentencia = $this->_db->prepare ( “SELECT usua_nombre,usua_pass,usua_email FROM usuarios WHERE usua_id=?” );
?>
Escapar a todo dato ingresado por el usuario. Este método es el más utilizado por los programadores, puesto que es suficiente para la mayoría de los ataques de inyección SQL. El funcionamiento de este método es que cada vez que el usuario introduzca los datos que vayamos a utilizar en una sentencia SQL escaparemos de los caracteres especiales para que el dato este limpio y el motor de la base de datos no lo confunda con una sentencia maliciosa a ejecutar. La función que permite escapar de este tipo de caracteres es mysqli_real_escape_string.
En la mayoría de las ocasiones es suficiente con implementar una protección básica ante los ataques de inyección SQL que puedan vulnerar la integridad de nuestras bases de datos, pero si eres un obstinado de la seguridad, la implementación de algunos de estos procedimientos hará de tu aplicación web una aplicación segura y totalmente protegida ante este tipo de ataques.
SEAS es el centro de formación online del Grupo San Valero, especializado en el ámbito técnico, industrial y de empresa. Visita www.seas.es para consultar nuestra oferta formativa de cursos y másteres. Formación profesional para el empleo de calidad y accesible para todos.