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)
-- ❌ 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 datosInyección SQL
La forma correcta
-- ✅ 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/3Esta consulta concatena el nick del jugador (inyección SQL). Reescríbela parametrizada con ?.
Este código tiene un fallo:
MySQL.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 }).
¿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.
Completa el UPDATE parametrizado con varios valores, en el orden correcto.
MySQL.update.await( 'UPDATE users SET money = ?, bank = ? WHERE identifier = ?', { cash, , })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:
