Einleitung: Warum die Sicherheit von Java-Anwendungen kritisch ist
Java bleibt eine der beliebtesten Sprachen für die Entwicklung von Unternehmens- und Webanwendungen. Die Popularität zieht jedoch auch erhöhte Aufmerksamkeit von Angreifern auf sich. Laut OWASP (Open Web Application Security Project) sind die meisten Einbrüche auf typische Entwicklerfehler zurückzuführen, nicht auf Schwachstellen der Plattform selbst. In diesem Artikel analysieren wir die Top 10 der gefährlichsten Schwachstellen in Java-Anwendungen, zeigen Codebeispiele und geben praktische Schutzempfehlungen.
1. SQL-Injection
Problem: Übergabe ungeprüfter Benutzereingaben in eine SQL-Abfrage.
Beispiel für anfälligen Code:
String query = "SELECT * FROM users WHERE username = '" + userInput + "'";
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(query);
Lösung: Verwenden Sie parametrisierte Abfragen (PreparedStatement).
String query = "SELECT * FROM users WHERE username = ?";
PreparedStatement pstmt = connection.prepareStatement(query);
pstmt.setString(1, userInput);
ResultSet rs = pstmt.executeQuery();
2. Cross-Site Scripting (XSS)
Problem: Einschleusung bösartiger Skripte in eine Webseite über Benutzereingaben.
Beispiel einer Schwachstelle:
String comment = request.getParameter("comment");
out.println("<div>" + comment + "</div>");
Lösung: Maskieren Sie HTML-Zeichen. Verwenden Sie Bibliotheken wie OWASP Java Encoder.
import org.owasp.encoder.Encode;
String comment = request.getParameter("comment");
out.println("<div>" + Encode.forHtml(comment) + "</div>");
3. Unsichere Deserialisierung
Problem: Ein Angreifer kann ein serialisiertes Objekt übermitteln, das bei der Deserialisierung beliebigen Code ausführt.
Beispiel:
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
Object obj = ois.readObject(); // Gefährlich!
Lösung:
- Deserialisieren Sie keine Daten aus nicht vertrauenswürdigen Quellen.
- Verwenden Sie Whitelists für Klassen (Look-Ahead Deserialization).
- Nutzen Sie JSON (Jackson) mit Sicherheitseinstellungen.
ObjectMapper mapper = new ObjectMapper();
mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); // Unsicher!
// Richtig: defaultTyping deaktivieren und @JsonTypeInfo verwenden
4. Cross-Site Request Forgery (CSRF)
Problem: Ein Angreifer zwingt einen Benutzer, eine unerwünschte Aktion auf einer vertrauenswürdigen Website auszuführen.
Lösung: Verwenden Sie CSRF-Tokens. In Spring Security ist dies integriert:
<form action="/transfer" method="post">
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
<input type="text" name="amount"/>
<button type="submit">Überweisen</button>
</form>
5. Mängel bei Authentifizierung und Session-Verwaltung
Probleme: Schwache Passwörter, ungeschützte Cookies, fixierte Sessions.
Empfehlungen:
- Verwenden Sie bcrypt oder Argon2 zum Hashen von Passwörtern.
- Setzen Sie die Flags
HttpOnlyundSecurefür Cookies. - Implementieren Sie eine Sperre nach N fehlgeschlagenen Anmeldeversuchen.
PasswordEncoder encoder = new BCryptPasswordEncoder();
String hashedPassword = encoder.encode(plainPassword);
6. Unsichere Konfiguration (Security Misconfiguration)
Problem: Aktivierte Debug-Modi, Standard-Passwörter, ungeschützte Endpunkte.
Lösung: