SQL injection · Inyección SQL
When input becomes a command
- Many apps build a database query by gluing the user's input into a string. That is dangerous.
- If an attacker types SQL as their input, it can become part of the query. This is SQL injection — the most famous web attack.
Cuando la entrada se convierte en una orden
- Muchas aplicaciones construyen una consulta de base de datos concatenando la entrada del usuario en una cadena. Eso es peligroso.
- Si un atacante escribe SQL como su entrada, este puede convertirse en parte de la consulta. Esto es inyección SQL — el ataque web más famoso.
See the attack
- Imagine a login that checks
... WHERE name = '<whatever you typed>'. - An attacker types
' OR '1'='1as the name. The query becomes:
'1'='1'is always true, so the database returns every user. The login is bypassed. Run it and see.
Observa el ataque
- Imagina un inicio de sesión que verifica
... WHERE name = '<whatever you typed>'. - Un atacante escribe
' OR '1'='1como nombre. La consulta se convierte en:
SELECT * FROM users WHERE name = '' OR '1'='1';
'1'='1'es siempre verdadero, por lo que la base de datos devuelve todos los usuarios. El inicio de sesión es vulnerado. Ejecútalo y compruébalo.
The fix: parameterised queries
- Never glue user input into SQL. Use parameterised queries (also called prepared statements).
- The database treats the input strictly as a value, never as code — so
' OR '1'='1is just a (failed) name to look up. - Also apply least privilege: the web app's database account should only do what it needs.
La solución: consultas parametrizadas
- Nunca concatenes la entrada del usuario en SQL. Usa consultas parametrizadas (también llamadas sentencias preparadas).
- La base de datos trata la entrada estrictamente como un valor, nunca como código — así que
' OR '1'='1es simplemente un (falso) nombre para buscar. - Aplica también el principio de mínimo privilegio: la cuenta de base de datos de la aplicación web solo debería tener permisos para hacer lo necesario.
Your turn
- Below, write a precise, safe query that returns only bob by his
id. That is the spirit of a parameterised lookup.
Covers: A-Level data security; web application security.
Tu turno
- A continuación, escribe una consulta precisa y segura que devuelva únicamente a bob mediante su
id. Ese es el espíritu de una búsqueda parametrizada.
Cubre: Seguridad de datos A-Level; seguridad de aplicaciones web.
Common mistakes
- Never build a query by joining raw user input into the text.
- Use parameterised queries so input can never change the query.
Errores comunes
- Nunca construyas una consulta uniendo la entrada cruda del usuario en el texto.
- Usa consultas parametrizadas para que la entrada nunca pueda alterar la consulta.
First, run the attack and see the damage. The app glued the attacker's input into the query, so the condition became name = '' OR '1'='1'. Complete the query exactly like that and see every user leak out. · Primero, ejecuta el ataque y observa los daños. La aplicación concatenó la entrada del atacante en la consulta, por lo que la condición se convirtió en name = '' OR '1'='1'. Completa la consulta exactamente de esa manera y haz que todos los usuarios aparezcan.
Click Run to see the output here. · Haz clic en Ejecutar para ver la salida aquí.
A safe lookup uses a precise condition. Change the query to return only bob's row, by adding WHERE id = 2. · Una búsqueda segura utiliza una condición precisa. Cambia la consulta para que devuelva solo la fila de bob, agregando WHERE id = 2.
Click Run to see the output here. · Haz clic en Ejecutar para ver la salida aquí.