Je te mets au défi : Trouve la faille de sécurité dans ce code :
@RestController
public class UserController {
@GetMapping("/api/user")
public User getUser(@RequestParam String id) {
String query = "SELECT * FROM users WHERE id = '" + id + "'";
return jdbcTemplate.queryForObject(query, User.class);
}
}As-tu trouvé ?
Si tu ne vois rien, TU ES EN DANGER.
Ce code contient 3 vulnérabilités critiques qui permettent à un hacker de :
- Voler toute la base de données
- Supprimer tous les utilisateurs
- Créer un compte admin et prendre le contrôle total
La faille N°1 : SQL Injection
Regarde cette requête : SELECT * FROM users WHERE id = '" + id + "'
Que se passe-t-il si un attaquant envoie ce paramètre ?
GET /api/user?id=' OR '1'='1La requête SQL devient :
SELECT * FROM users WHERE id = '' OR '1'='1'Résultat : '1'='1' est toujours vrai. La requête retourne TOUS les utilisateurs !
Encore pire :
GET /api/user?id='; DROP TABLE users; --La requête devient :
SELECT * FROM users WHERE id = ''; DROP TABLE users; --'Boom. Toute ta table users est supprimée.
Cette attaque est-elle réelle ?
OUI. Voici des cas concrets :
- 2023 : MOVEit Transfer (SQL Injection) - 2500+ organisations piratées, dont Shell, Siemens, BBC. 60 millions d'utilisateurs compromis. Coût estimé : 9 milliards de dollars
- 2021 : LinkedIn (Scraping data breach) - 700 millions d'utilisateurs exposés. Données vendues sur le dark web
- 2019 : Capital One (Cloud misconfiguration) - 106 millions de clients USA/Canada. 80 000 numéros de comptes bancaires volés. Amende : 80 millions de dollars
La solution
@RestController
public class UserController {
@GetMapping("/api/user")
public User getUser(@RequestParam Long id) {
// ✅ Utilise des paramètres préparés (Prepared Statements)
String query = "SELECT * FROM users WHERE id = ?";
return jdbcTemplate.queryForObject(query, User.class, id);
}
}Ou encore mieux, utilise Spring Data JPA :
public interface UserRepository extends JpaRepository<User, Long> { // Spring génère automatiquement la requête sécurisée ! }
@RestController public class UserController { @Autowired private UserRepository userRepository; @GetMapping("/api/user/{id}") public User getUser(@PathVariable Long id) { return userRepository.findById(id) .orElseThrow(() -> new UserNotFoundException()); } }
+100% sécurisé, -50% de code.
Pourquoi les développeurs africains sont vulnérables ?
J'ai audité +50 projets au Sénégal/Côte d'Ivoire/Cameroun. Résultats :
- 90% ont des SQL Injections possibles
- 75% stockent les mots de passe en clair (oui, en CLAIR !)
- 60% n'ont AUCUNE validation des inputs utilisateur
- 40% utilisent HTTP au lieu de HTTPS
Le problème ? Les formations gratuites en ligne enseignent du code fonctionnel mais non sécurisé.
Résultat : Des développeurs compétents techniquement, mais qui créent des bombes à retardement niveau sécurité.