Cómo prevenir los ataques por SQL Injection en aplicaciones PHP

Home / Cómo hacer para... / Cómo prevenir los ataques por SQL Injection en aplicaciones PHP

Uno de los fantasmas más temidos por quienes contratan servicios de desarrollo (especialmente cuando se trata de su primera experiencia) es el de los ataques de hackers.

Si bien es imposible asegurar al 100% un sistema (de software o de cualquier otro tipo), existe una serie de buenas prácticas que disminuyen sensiblemente la probabilidad de ocurrencia de tales ataques (o al menos, su probabilidad de éxito).

Por lo general, los ataques se basan en la explotación de código vulnerable como ser algún caso raro que el desarrollador no tuvo en cuenta.

Uno de los ataques más usuales es el conocido como sql injection.

SQL_Injection

De lo que se trata es de ejecutar código sql sin autorización.

Los scripts de PHP que no están bien escritos pueden ser atacados de esta forma.

Veamos un ejemplo:

<?php

$sql = "SELECT * FROM users WHERE nombre = '".$_POST['nombre']."'";

$db->query($sql);

Si el $_POST se llena normalmente no habría problema (Si lo hace un usuario legítimo de nuestra aplicación), pero… ¿qué pasa si un usuario malicioso lo hace?

Por ejemplo, qué tal si alguien pusiera algo como esto en el campo nombre:

';DROP TABLE users;--

El sql total quedaría así:

SELECT * FROM users WHERE nombre = '';DROP TABLE users;--'

Por si lo querés ver más gráfico, te dejo este excelente comic.

Bueno… formas de protegerse de esto hay muchas, una muy práctica es utilizar los prepared statements de PDO.

El ejemplo quedaría de esta forma:

<?php

$sql = "SELECT * FROM users WHERE nombre = :nombre";
$st = $db->prepare( $sql );
$st->execute( [ ':nombre' => $_POST['nombre'] ] );

De este modo, dejamos en manos de PDO la realización de las validaciones y el agregado de comillas donde corresponda, de modo que el sql a ejecutar quede de esta forma:

SELECT * FROM users WHERE nombre = '\';DROP TABLE users;--\''

Con lo cual se vuelve completamente inofensivo 🙂

mchojrin

CEO at Leeway
Mauro es Lic. en Ciencias de la Computación.
Su carrera como docente de programación se inició en el año 1997 en la Escuela Técnica ORT.
Actualmente coordina el desarrollo de proyectos web en Leeway y los cursos dictados en la Leeway Academy

One Comment

Deja un comentario

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