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)

lua
-- ❌ 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 datos

Inyección SQL

La forma correcta

lua
-- ✅ 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
Test

¿Por qué es peligroso construir la query con "... WHERE name = '" .. nombre .. "'"?

Corrige el error

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:

1local citizenid = Player.PlayerData.citizenid
2local 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 }).

Rellena los huecos

Completa el UPDATE parametrizado que cambia el dinero de un jugador buscándolo por su citizenid.

1local citizenid = Player.PlayerData.citizenid
2MySQL.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:

¿Qué tal esta lección?