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