Introduction : Pourquoi la sécurité des applications Java n'est pas une option, mais une nécessité
Java reste l'un des langages les plus populaires pour le développement d'applications d'entreprise et web. Cependant, la popularité entraîne une attention accrue de la part des attaquants. Selon l'OWASP (Open Web Application Security Project), les vulnérabilités dans le code entraînent chaque année des fuites de données et des pertes financières de plusieurs milliards de dollars. Dans cet article, nous analyserons le top 10 des vulnérabilités des applications Java, montrerons des exemples de code réels et donnerons des recommandations concrètes pour la protection. Ce contenu sera utile aussi bien aux développeurs débutants qu'aux développeurs expérimentés souhaitant écrire du code sécurisé.
1. Injections : SQL, LDAP et Command Injection
Les injections restent le roi des vulnérabilités. Le cas le plus fréquent est l'injection SQL, où l'entrée utilisateur est directement concaténée dans une requête SQL.
Exemple de code vulnérable
String query = "SELECT * FROM users WHERE username = '" + request.getParameter("user") + "'";
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(query);
Si un attaquant transmet admin' OR '1'='1, il obtiendra l'accès à tous les utilisateurs.
Comment se protéger
- Utilisez PreparedStatement : les requêtes paramétrées échappent automatiquement les entrées.
- Validez les données d'entrée côté serveur (listes blanches).
- Pour LDAP et les commandes OS, utilisez l'échappement et évitez d'appeler
Runtime.exec()avec des données utilisateur.
// Version sécurisée
String query = "SELECT * FROM users WHERE username = ?";
PreparedStatement pstmt = connection.prepareStatement(query);
pstmt.setString(1, request.getParameter("user"));
ResultSet rs = pstmt.executeQuery();
2. Violation de l'authentification et de la gestion des sessions
L'authentification faible est la deuxième vulnérabilité la plus dangereuse. On rencontre souvent : l'absence de limitation du nombre de tentatives de connexion, le stockage des mots de passe en clair, des session ID prévisibles.
Recommandations
- Stockez les mots de passe uniquement sous forme de hachages avec sel (par exemple, bcrypt ou Argon2).
- Utilisez
SecureRandompour générer les jetons de session. - Définissez des délais d'expiration de session et un mécanisme « se souvenir de moi » avec un jeton sécurisé.
// Génération d'un session ID sécurisé
import java.security.SecureRandom;
String sessionId = new SecureRandom().ints(48, 122)
.filter(i -> Character.isLetterOrDigit(i))
.limit(64)
.collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
.toString();
3. XSS (Cross-Site Scripting)
Le XSS permet d'injecter du JavaScript malveillant dans une page consultée par d'autres utilisateurs. C'est particulièrement dangereux pour les applications web Java avec JSP ou Thymeleaf.
Exemple de vulnérabilité
<div>${userComment}</div>
Si userComment contient <script>alert('XSS')</script>, le code s'exécutera dans le navigateur.
Protection
- Échappez la sortie : dans JSP, utilisez
c:outoufn:escapeXml(). - Pour Thymeleaf —
th:utextest dangereux, utilisezth:text. - Appliquez les en-têtes Content Security Policy (CSP).
4. Désérialisation non sécurisée
La désérialisation Java est l'une des vulnérabilités les plus critiques, permettant l'exécution de code arbitraire (RCE). Un attaquant peut falsifier le flux d'octets et injecter un objet malveillant.
Exemple d'attaque
ObjectInputStream ois = new ObjectInputStream(request.getInputStream());
Object obj = ois.readObject(); // Danger !
Comment se protéger
- Ne désérialisez pas ```