Base de datos con oxmysql · Lección 2/3 · 8 min

Consultas parametrizadas: cierra la puerta a la inyección SQL

Concatenar texto en una query es el agujero más clásico. Los placeholders (?) lo cierran.

La inyección SQL ocurre cuando metes datos del usuario dentro de la consulta como texto. Un nombre malicioso podría borrarte la base de datos. La solución son los placeholders ?.

El agujero (NUNCA hagas esto)

lua
-- ❌ PELIGRO: concatena el nombre directamente
local nombre = pedidoDelJugador
MySQL.query.await("SELECT * FROM users WHERE name = '" .. nombre .. "'")
-- si nombre = "'; DROP TABLE users; --"  →  adiós base de datos

Inyección SQL

La forma correcta

lua
-- ✅ El ? se rellena de forma segura, escapando el valor
MySQL.query.await('SELECT * FROM users WHERE name = ?', { nombre })

-- Varios parámetros, en orden
MySQL.update.await(
  'UPDATE users SET money = ?, bank = ? WHERE identifier = ?',
  { cash, bank, identifier }
)

Parametrizado

Regla sin excepciones: TODO valor que no escribas tú a mano va como ? en la tabla de parámetros. Nunca con .. dentro del SQL. Esto también vale para números (más limpio y consistente).

Practica lo aprendido

0/3
Corrige el error

Esta consulta concatena el nick del jugador (inyección SQL). Reescríbela parametrizada con ?.

Este código tiene un fallo:

1MySQL.query.await("SELECT * FROM characters WHERE nick = '" .. nick .. "'")

Reescríbelo corregido:

Pista

Saca el valor del string y mételo en la tabla de parámetros: ('... WHERE nick = ?', { nick }).

Test

¿Por qué es peligroso meter el texto del jugador en la consulta concatenándolo con ..?

Pista

Piensa en qué pasa si el nick contiene comillas y un ; DROP TABLE.

Rellena los huecos

Completa el UPDATE parametrizado con varios valores, en el orden correcto.

1MySQL.update.await(
2 'UPDATE users SET money = ?, bank = ? WHERE identifier = ?',
3 { cash, , }
4)
Pista

Los parámetros van en el MISMO orden que los ? de la consulta: money, bank, identifier.

Reto: prográmalo tú

Te dan una consulta que concatena el nick del jugador para buscarlo. Reescríbela parametrizada.

Escríbelo tú en tu editor (VS Code) y pruébalo en tu servidor. Aquí se aprende haciéndolo, no copiando.

Ver pista

Saca el valor del string y mételo en la tabla de parámetros { nick }.

Escribe aquí tu solución:

¿Qué tal esta lección?