Base de datos con oxmysql · Lección 2/3 · 8 min
Consultas parametrizadas: cierra 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 dato directamente
local cid = datoDelJugador
MySQL.query.await("SELECT * FROM players WHERE citizenid = '" .. cid .. "'")
-- si cid = "'; DROP TABLE players; --" → adiós base de datosInyección SQL
La forma correcta
-- ✅ El ? se rellena de forma segura, escapando el valor
MySQL.query.await('SELECT * FROM players WHERE citizenid = ?', { cid })
-- Varios parámetros, en orden
MySQL.update.await(
'UPDATE player_houses SET price = ?, label = ? WHERE id = ?',
{ precio, etiqueta, id }
)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. También vale para números (más limpio y consistente).
Practica lo aprendido
0/3¿Por qué es peligroso construir la query con "... WHERE name = '" .. nombre .. "'"?
Esta consulta concatena el citizenid del jugador dentro del string. Reescríbela parametrizada con ? para cerrar la inyección SQL.
Este código tiene un fallo:
local citizenid = Player.PlayerData.citizenidlocal filas = MySQL.query.await("SELECT * FROM player_vehicles WHERE citizenid = '" .. citizenid .. "'")Reescríbelo corregido:
Pista
Saca el citizenid del string y mételo en la tabla de parámetros: ('... WHERE citizenid = ?', { citizenid }).
Completa el UPDATE parametrizado que cambia el dinero de un jugador buscándolo por su citizenid.
local citizenid = Player.PlayerData.citizenidMySQL.update.await('UPDATE players SET money = WHERE citizenid = ', { dinero, citizenid })Pista
Cada valor que no escribas a mano va como ?, y en el array { } van en el MISMO orden que aparecen los ?.
Reto: prográmalo tú
Te dan una consulta que concatena el citizenid 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 { cid }.
Escribe aquí tu solución:
