¿Cómo evitar la inyección SQL en PHP?

0
73
PHP
PHP

En este tutorial vamos a explicar como ejecutar consultas en nuestra página web y evitar la inyección de sql. Para empezar debemos tener en cuenta que hay que usar declaraciones ya preparadas y consultas parametrizadas. ¿Por qué hay que hacerlo de esta manera? Muy sencillo: Para evitar que el usuario atacante pueda modificar la consulta e inyecte el sql malicioso.

Hay dos maneras posibles de evitar inyección sql

Usando PDO (Compatible con cualquier controlador de BBDD)

$stmt = $pdo->prepare('SELECT * FROM empleados WHERE nombre= :nombre');

$stmt->execute(array('nombre' => $nombre));

foreach ($stmt as $row) {
 echo $row['nombre'];
}

Usando MySQLi (para MySQL):

$stmt = $dbConnection->prepare('SELECT * FROM empleados WHERE nombre= ?');
$stmt->bind_param('s', $nombre); // 's' indica que la variable es de tipo => 'string'

$stmt->execute();

$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
// Sacar los datos con $row
}

Configurar correctamente la conexión a la Base de datos

Hay que tener en cuenta que si usamos PDO para acceder a la BBDD MYSQL las declaraciones que estamos preparando como en el ejemplo de arriba no se ejecutan así tal cual. Para darle una solución hay que desactivar la emulación en estas declaraciones. Para ello lo único que tienes que hacer es crear el archivo de configuración de la BBDD de la siguiente manera:

$dbConnection = new PDO('mysql:dbname=basededatos;host=127.0.0.1;charset=utf8', 'usuario', 'pass');

$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

Si activamos el modo de error con setAttribute podemos detectar cualquier fallo de sql al ejecutar la consulta. La declaración ATTR_EMULATE_PREPARES,false deshabilita las declaraciones preparadas emuladas y usa las reales por lo tanto es obligatorio.

Dejar respuesta

Please enter your comment!
Please enter your name here