Sécurité des applications Java : top 10 des vulnérabilités et comment les éviter

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction : pourquoi la sécurité des applications Java est-elle cruciale ?

Java reste l'un des langages les plus populaires pour créer des applications d'entreprise et web. Cependant, la popularité attire également une attention accrue de la part des attaquants. Selon l'OWASP (Open Web Application Security Project), la plupart des piratages sont dus à des erreurs typiques des développeurs, et non à des vulnérabilités de la plateforme elle-même. Dans cet article, nous analyserons le top 10 des vulnérabilités les plus dangereuses des applications Java, montrerons des exemples de code et donnerons des recommandations pratiques pour la protection.

1. Injections SQL (SQL Injection)

Problème : Transmission de données utilisateur non vérifiées dans une requête SQL.

Exemple de code vulnérable :

String query = "SELECT * FROM users WHERE username = '" + userInput + "'";
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(query);

Solution : Utilisez des requêtes paramétrées (PreparedStatement).

String query = "SELECT * FROM users WHERE username = ?";
PreparedStatement pstmt = connection.prepareStatement(query);
pstmt.setString(1, userInput);
ResultSet rs = pstmt.executeQuery();

2. Scripting intersite (XSS)

Problème : Injection de scripts malveillants dans une page web via une entrée utilisateur.

Exemple de vulnérabilité :

String comment = request.getParameter("comment");
out.println("<div>" + comment + "</div>");

Solution : Échappez les caractères HTML. Utilisez des bibliothèques comme OWASP Java Encoder.

import org.owasp.encoder.Encode;
String comment = request.getParameter("comment");
out.println("<div>" + Encode.forHtml(comment) + "</div>");

3. Désérialisation non sécurisée

Problème : Un attaquant peut transmettre un objet sérialisé qui, lors de la désérialisation, exécutera du code arbitraire.

Exemple :

ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
Object obj = ois.readObject(); // Dangereux !

Solution :

  • Ne désérialisez pas les données provenant de sources non fiables.
  • Utilisez des listes blanches de classes (look-ahead deserialization).
  • Appliquez JSON (Jackson) avec des paramètres de sécurité.
ObjectMapper mapper = new ObjectMapper();
mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); // Non sécurisé !
// Correct : désactiver defaultTyping et utiliser @JsonTypeInfo

4. Contrefaçon de requête intersite (CSRF)

Problème : Un attaquant force un utilisateur à effectuer une action non désirée sur un site de confiance.

Solution : Utilisez des jetons CSRF. Dans Spring Security, c'est intégré :

<form action="/transfer" method="post">
    <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
    <input type="text" name="amount"/>
    <button type="submit">Transférer</button>
</form>

5. Défauts d'authentification et de gestion des sessions

Problèmes : Mots de passe faibles, cookies non sécurisés, sessions fixes.

Recommandations :

  • Utilisez bcrypt ou Argon2 pour le hachage des mots de passe.
  • Définissez les drapeaux HttpOnly et Secure pour les cookies.
  • Implémentez un verrouillage après N tentatives de connexion échouées.
PasswordEncoder encoder = new BCryptPasswordEncoder();
String hashedPassword = encoder.encode(plainPassword);

6. Mauvaise configuration de sécurité (Security Misconfiguration)

Problème : Modes debug activés, mots de passe par défaut, endpoints non sécurisés.

Solution :

Blogs

Book Recommendations