Seguridad web: nunca confíes en la entrada del usuario
Inyección, XSS y CSRF son tres versiones de un mismo error: tratar lo que alguien escribió como si fuera un comando.
Toda vulnerabilidad web que veas a este nivel es una regla rota: nunca confíes en la entrada que viene de fuera de tu programa. Tu navegador, tu formulario, tu API y tu cookie están todos fuera. La entrada no es "mala": es texto perfectamente válido. El fallo es que tu programa dejó de tratarla como datos y permitió que se convirtiera en parte de un comando, una consulta, una página o una petición.
the page builds a greeting from the name you typed
name you typed: Ada
page shows: Hello, Ada
name you typed: <script>...</script>
page shows: the browser obeys the script instead of printing it
cause: the server put your text into the page without escaping itEl usuario escribió texto. La página decidió que era marcado. El navegador no tenía forma de distinguirlo.La inyección SQL es el mismo error una capa más abajo. Si el código pega texto del usuario dentro de una cadena SQL, un valor como una dirección de correo deja de ser un valor y pasa a formar parte de la gramática de la consulta. El ejemplo clásico es un formulario de acceso donde el texto que sigue a una comilla convierte el resto de la consulta en un comentario. La defensa no es buscar comillas: es usar parámetros, para que la base de datos reciba siempre la estructura de la consulta y los valores por separado y nunca tenga que adivinar qué es qué.
SELECT id, email FROM users
WHERE email = 'student@example.org' AND password_hash = '...';
-- the same query, built by gluing user input into the text:
-- 1 OR 1=1 --
-- the condition stops being a condition and becomes a statementUn valor pegado en el texto de la consulta se convierte en texto de la consulta. Un parámetro sigue siendo un valor, por raro que parezca.Práctica
Un formulario de acceso construye su consulta pegando texto. ¿Qué cambio elimina de verdad la inyección SQL?
Pistas
- Encuentra el punto donde el texto deja de ser dato y pasa a ser parte del comando.
- Las comillas no son lo mismo que un parámetro: una es puntuación y el otro es un valor que la base de datos mantiene aparte.
15 XP
Relaciona cada ataque con la parte del sistema que ejecuta el texto del atacante.
Pistas
- Pregúntate qué programa acaba ejecutando el texto del atacante: la base de datos, el navegador o el shell.
- La solución es siempre la misma idea, pero el lugar donde se aplica cambia.
15 XP
Escribe isSafeNickname(name), que acepte solo letras, dígitos y guiones bajos, de 3 a 16 caracteres. Esta comprobación no admite listas negras: describe lo que se permite en vez de lo que se prohíbe.
Pistas
- Una lista blanca compara con los valores que aceptas; una lista negra solo quita los que se te ocurrieron.
- La longitud es una comprobación barata que detiene cargas enormes antes de que se ejecute nada más.
18 XP