Aller au contenu principal
ShadowAcademy

Les langages Sécurité FiveM Données et fuites

Injection SQL depuis Lua

La branche SQL a montré l'injection côté langage. Voici la même faille, telle qu'elle apparaît dans un script FiveM :

-- NE JAMAIS FAIRE
MySQL.query.await("SELECT * FROM joueurs WHERE pseudo = '" .. nom .. "'")

nom vient d'un événement, donc potentiellement d'un menu de triche. Avec nom = "x' OR '1'='1", la requête renvoie toute la table ; avec un UPDATE ou un DELETE, les dégâts sont pires.

La requête préparée

oxmysql sépare le texte de la requête et les valeurs :

local lignes = MySQL.query.await(
    'SELECT pseudo, metier FROM joueurs WHERE pseudo = ?',
    { nom }
)

Chaque ? est remplacé par la valeur correspondante de la table, en tant que valeur : la base ne la lira jamais comme une instruction. Les paramètres nommés fonctionnent de la même façon :

MySQL.query.await('SELECT * FROM joueurs WHERE pseudo = @nom', { ['@nom'] = nom })

Ce qui ne marche pas

  • Échapper soi-même les apostrophes, ou passer par string.format('%q') : la valeur finit toujours collée dans le texte, et il existe toujours un cas oublié.
  • Filtrer des mots (DROP, OR…) : cela bloque le joueur nommé Doris et laisse passer ce qui est écrit autrement.

La règle est la même qu'en PHP ou en Python : une valeur ne touche jamais le texte de la requête.

1 exercice pour cette lecon

Les exercices demandent un compte : il faut bien enregistrer votre progression quelque part. La lecture, elle, reste libre. Creer un compte

  • Chercher sans se faire injecter moyen lecon a valider