Problemas de consultas en PDO en PHP
Como ya debes saber, las consultas SQL son susceptibles a inyecciones SQL. La extensión PDO está diseñada para combatir las inyecciones, pero simplemente así, por defecto, no lo hace.
Veamos el problema con un ejemplo. Supongamos que tenemos la siguiente consulta, en la que se inserta una variable:
<?php
$sql = "SELECT * FROM users WHERE id=$id";
$res = $pdo->query($sql);
?>
Supongamos que nuestra variable llega desde algún lugar externo, por ejemplo, desde un parámetro GET. Por simplicidad, sin embargo, simplemente establezcamos su valor manualmente. Esperamos algún valor numérico, por ejemplo, así:
<?php
$id = 1;
?>
Un hacker malintencionado, sin embargo, podría enviar
el siguiente valor (supongamos que tenemos
un campo role):
<?php
$id = '-1 OR role="admin"';
?>
Resulta que queríamos la siguiente consulta:
<?php
$sql = "SELECT * FROM users WHERE id=1";
$res = $pdo->query($sql);
?>
Pero obtuvimos la siguiente, que extrae al administrador del sitio:
<?php
$sql = "SELECT * FROM users WHERE id=-1 OR role="admin"";
$res = $pdo->query($sql);
?>
Para evitar esta situación, en PDO se prevé un mecanismo especial, que se llama consultas preparadas. Las analizaremos en la siguiente lección.
Realiza intencionalmente una inyección SQL a tu base de datos.