Cómo evitar la inyección SQL en 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.

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

Por mchojrin

Ayudo a desarrolladores PHP a acceder mercados y clientes más sofisticados y exigentes

1 comentario

¿Te quedó alguna duda? Publica aca tu pregunta

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