AOWS

Just another adrian’s weblog

Seguridad en PHP: inyección SQL

with one comment

Uno de los aspectos más importantes de una aplicación web es su seguridad, debido sobre todo a la gran capacidad de interacción que tiene con los usuarios. Así, el programador debe tener en cuenta este aspecto y cuidar todas las entradas que procedan o puedan ser manipuladas por los visitantes.

La inyección SQL consiste en inyectar, valga la redundancia, código SQL dentro de una variable con el propósito de modificar la consulta que se ejecutará, intentando obtener o destruir datos. Veámoslo con un pequeño ejemplo:

[php]
$id = $_GET[‘id’];
$posts = mysql_query(“SELECT * FROM posts WHERE id = $id”);
[/php]

Este código recibe vía url una variable a partir de la cual recuperar unos valores en la base de datos. Sin embargo este código es vulnerable a cosas tan sencillas como que el usuario escriba en su barra de direcciones algo como script.php?id=12 UNION SELECT * FROM users.

La consulta real que se ejecutaría en este caso pasaría a ser:

[sql]
SELECT * FROM posts WHERE id = 12 UNION SELECT * FROM users
[/sql]

algo que por supuesto no querremos que suceda por la cantidad de datos que pueden quedar al descubierto. Y todavía podría ser peor si el código inyectado fuese alguna modificación o borrado.

Para solucionarlo debemos chequear al máximo cualquier entrada que proceda o pueda ser modificada por el usuario. En este caso bastaría con algo así:

[php]
$id = intval ( $_GET[“id”] );
[/php]

de forma que nos aseguremos de que la variable contenga un valor numérico.

Si en lugar de números tratamos con cadenas, también existen funciones como addslashes que nos permiten “escapar” los caracteres especiales y evitar el SQL injection. Pero esto lo trataremos en otra entrada.

Written by adrian

19 septiembre, 2007 a 00:34

Publicado en Posts

Tagged with , , , ,

Una respuesta

Subscribe to comments with RSS.

  1. […] tiempo hablé brevemente sobre la inyección SQL y cómo evitarla en ciertos casos concretos con PHP. En este post intentaré profundizar un poco […]


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: