Validar es asegurarte que los campos tengan un contenido aceptable
(que el campo e-mail se parezca a un e-mail; que todas las opciones
requeridas estén rellenas, etc.). Sanitizar es limpiar lo que te pasó
el usuario antes de ejecutar.
La validación sí o sí la tenés que hacer en el server: Si los datos
son inválidos, no podés meterlos en la DB porque te van a saltar las
constraints.
Opcionalmente, también podés hacerla del lado del cliente: Te ahorrás
el ida-y-vuelta para avisar "te falta esto", y el cliente tiene el
aviso más rápido.
Ahora, _validar_ un campo no da ninguna promesa de _seguridad_ (Que
hayas preguntado "cual es más seguro" es lo que me hace pensar que no
sabías realmente lo que es validar): Si hablamos técnicamente, una
dirección de e-mail acepta comentarios entre paréntesis, donde puedo
poner cualquier contenido (bueno, no "cualquiera"). Por esa
definición, direccion(';drop table users--)@ejemplo.com es VÁLIDA
(creo... a lo mejor hay que escapar esas comillas... no tengo ganas de
leerme el RFC entero). Ahora, no es SEGURA; no está SANITIZADA. Si
meto eso en mi DB sin la sanitización apropiada, no pasan cosas
buenas.
La sanitización también la tenés que hacer del lado del server.
Hacerla del lado del cliente no tiene sentido: Para los que no saben
cómo hacer un ataque, es esfuerzo desperdiciado. Para los que sí
saben, lo desactivan trivialmente...
Con eso dicho: yo no me preocupo demasiado por la sanitización
(add_slashes? mysql_escape? mysql_real_escape?), simplemente uso PDO,
y le paso los strings posiblemente insalubres como parámetro, que se
encargue de escapar alguien que sepa.
> Saludos
> J.
Tordek.
"La tenés que hacer del lado del server [porque si solo lo hacés del
lado del cliente] la pueden desactivar trivialmente"; me comí tres
cuartos de oración.
> "simplemente uso PDO,
> y le paso los strings posiblemente insalubres como parámetro, que se
> encargue de escapar alguien que sepa."
> No entendí eso, como que se encargue alguien que sepa?
A PDO le digo:
$query = $connection->prepare("SELECT * FROM a WHERE a.b = :param");
$query->bindValue(":param", $_GET['param']);
Dejo que PDO (o sea, el que programó PDO: "otro que sabe más que yo de
inyección") se encargue de preparar la query y meter los parámetros
como mejor corresponda.
>
> Saludos
> J.
>
> pd: no bardees, tenés razón expresé para la mierda la pregunta.
p.d: ¿Bardeé? No pretendía hacerlo :S...