Chapitre 1 · Leçon 1
La vulnérabilité n°1 depuis 20 ans
Section 1
Step 1
Une SQL Injection se produit quand une entrée utilisateur est directement concaténée dans une requête SQL. L'attaquant peut modifier la logique de la requête.
snippet.typescript
1// ❌ Code vulnérable — JAMAIS faire ça
2app.get('/user', async (req, res) => {
3 const email = req.query.email; // Contrôlé par l'attaquant
4
5 // Requête construite par concaténation
6 const query = `SELECT * FROM users WHERE email = '${email}'`;
7
8 // Si email = "' OR '1'='1" :
9 // SELECT * FROM users WHERE email = '' OR '1'='1'
10 // → Retourne TOUS les utilisateurs !
11
12 // Si email = "'; DROP TABLE users; --" :
13 // SELECT * FROM users WHERE email = ''; DROP TABLE users; --'
14 // → Supprime la table users !
15
16 // Si email = "' UNION SELECT id, password, email FROM admins --" :
17 // → Fuite de la table admins !
18
19 const users = await db.query(query);
20 res.json(users);
21});Step 2
La protection fondamentale : ne jamais concaténer des données utilisateur dans du SQL. Utiliser des paramètres liés (prepared statements) ou un ORM.