Sécurité des applications Java : top 10 des vulnérabilités pour débutants

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

Sécurité des applications Java : top 10 des vulnérabilités pour débutants

\n

Java reste l'un des langages les plus populaires pour créer des applications d'entreprise et web. Cependant, même une plateforme fiable ne garantit pas la sécurité du code. Selon OWASP, la plupart des piratages sont dus à des erreurs de développeurs, et non à des vulnérabilités dans la JVM. Dans cet article, nous allons passer en revue le top 10 des vulnérabilités des applications Java que tout développeur débutant doit connaître. Vous obtiendrez non seulement des connaissances théoriques, mais aussi des exemples pratiques de code avec des explications sur la façon d'éviter les erreurs dangereuses.

\n\n

1. Injections SQL (SQL Injection)

\n

La menace la plus courante. Un attaquant peut exécuter une requête SQL arbitraire si vous concaténez des chaînes directement.

\n

Mauvais exemple (code vulnérable) :

\n
String query = "SELECT * FROM users WHERE username = '" + userName + "' AND pass = '" + password + "'";\nStatement stmt = connection.createStatement();\nResultSet rs = stmt.executeQuery(query);
\n

Solution : utilisez PreparedStatement avec des requêtes paramétrées.

\n
String query = "SELECT * FROM users WHERE username = ? AND pass = ?";\nPreparedStatement pstmt = connection.prepareStatement(query);\npstmt.setString(1, userName);\npstmt.setString(2, password);\nResultSet rs = pstmt.executeQuery();
\n\n

2. Scripting intersite (XSS)

\n

Si vous affichez des données utilisateur dans du HTML sans échappement, un attaquant peut injecter du code JavaScript.

\n

Code vulnérable (JSP) :

\n
<%= request.getParameter("message") %>
\n

Protection : échappez la sortie à l'aide de bibliothèques (par exemple, OWASP Java Encoder) ou utilisez des moteurs de templates avec auto-échappement (Thymeleaf, JSP avec JSTL).

\n
<c:out value="${message}" />
\n\n

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

\n

La désérialisation Java peut conduire à une exécution de code à distance (RCE) si un attaquant transmet un flux d'octets spécialement conçu.

\n

Mauvaise pratique :

\n
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());\nObject obj = ois.readObject(); // n'importe quoi peut être reconstruit
\n

Recommandations :

\n
    \n
  • Ne désérialisez jamais des données provenant de sources non fiables.
  • \n
  • Utilisez des listes blanches de classes (look-ahead object input stream).
  • \n
  • Envisagez des alternatives (JSON, Protobuf).
  • \n
\n\n

4. Injection de commandes système (Command Injection)

\n

Si votre application appelle des commandes système avec des données utilisateur, une injection est possible.

\n

Code dangereux :

\n
Runtime.getRuntime().exec("ping " + userInput); // userInput = 127.0.0.1; rm -rf /
\n

Protection : évitez d'appeler des commandes shell, utilisez des bibliothèques Java intégrées. Si l'appel est inévitable, validez les données d'entrée avec une liste blanche stricte.

\n\n

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

\n

Une faible protection des sessions est un problème fréquent. Par exemple, l'utilisation d'identifiants de session prévisibles ou le stockage de mots de passe en clair.

\n
    \n
  • Générez des ID de session avec SecureRandom.
  • \n
  • Utilisez des hachages modernes (bcrypt, scrypt, Argon2) pour les mots de passe.
  • \n
  • Définissez des délais d'expiration de session et les flags HttpOnly/Secure pour les cookies.
  • \n
\n\n

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

\n

Les modes de débogage laissés actifs, les mots de passe par défaut, les ports ouverts — tout cela donne à un attaquant des informations sur le système.

\n

Que vérifier dans Spring Boot :

\n
    \n
  • Désactivez les endpoints Actuator en production ou protégez-les.
  • \n
  • N'utilisez pas spring.jpa.show-sql=true en production.
  • \n
  • Supprimez les en-têtes de serveur par défaut

Blogs

Book Recommendations