Einleitung: Warum die Sicherheit von Java-Anwendungen keine Option, sondern eine Notwendigkeit ist
Java bleibt eine der beliebtesten Sprachen für die Entwicklung von Unternehmens- und Webanwendungen. Diese Popularität zieht jedoch auch erhöhte Aufmerksamkeit von Angreifern auf sich. Laut OWASP (Open Web Application Security Project) führen Schwachstellen im Code jährlich zu Datenlecks und finanziellen Verlusten in Milliardenhöhe. In diesem Artikel analysieren wir die Top-10-Schwachstellen von Java-Anwendungen, zeigen reale Codebeispiele und geben konkrete Schutzempfehlungen. Das Material ist sowohl für Anfänger als auch für erfahrene Entwickler nützlich, die sicheren Code schreiben möchten.
1. Injection: SQL, LDAP und Command Injection
Injection bleibt der König der Schwachstellen. Der häufigste Fall ist die SQL-Injection, bei der Benutzereingaben direkt in eine SQL-Abfrage konkateniert werden.
Beispiel für anfälligen Code
String query = "SELECT * FROM users WHERE username = '" + request.getParameter("user") + "'";Statement stmt = connection.createStatement();ResultSet rs = stmt.executeQuery(query);Wenn ein Angreifer admin' OR '1'='1 übergibt, erhält er Zugriff auf alle Benutzer.
Wie man sich schützt
- Verwenden Sie PreparedStatement: parametrisierte Abfragen maskieren die Eingabe automatisch.
- Validieren Sie Eingabedaten serverseitig (Whitelists).
- Für LDAP und Betriebssystembefehle verwenden Sie Maskierung und vermeiden Sie den Aufruf von
Runtime.exec()mit Benutzerdaten.
// Sicherer AnsatzString query = "SELECT * FROM users WHERE username = ?";PreparedStatement pstmt = connection.prepareStatement(query);pstmt.setString(1, request.getParameter("user"));ResultSet rs = pstmt.executeQuery();2. Fehlerhafte Authentifizierung und Session-Management
Schwache Authentifizierung ist die zweitgefährlichste Schwachstelle. Häufig anzutreffen sind: fehlende Begrenzung der Anmeldeversuche, Speicherung von Passwörtern im Klartext, vorhersagbare Session-IDs.
Empfehlungen
- Speichern Sie Passwörter nur als gehashte Werte mit Salt (z. B. bcrypt oder Argon2).
- Verwenden Sie
SecureRandomzur Generierung von Session-Tokens. - Setzen Sie Session-Timeout und einen „Angemeldet bleiben“-Mechanismus mit sicherem Token ein.
// Generierung einer sicheren Session-IDimport 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)
XSS ermöglicht das Einschleusen von schädlichem JavaScript in eine Seite, die von anderen Benutzern betrachtet wird. Dies ist besonders gefährlich für Webanwendungen in Java mit JSP oder Thymeleaf.
Beispiel für eine Schwachstelle
<div>${userComment}</div>Wenn userComment <script>alert('XSS')</script> enthält, wird der Code im Browser ausgeführt.
Schutz
- Maskieren Sie die Ausgabe: Verwenden Sie in JSP
c:outoderfn:escapeXml(). - Für Thymeleaf ist
th:utextgefährlich, verwenden Sieth:text. - Wenden Sie Content Security Policy (CSP)-Header an.
4. Unsichere Deserialisierung
Java-Deserialisierung ist eine der kritischsten Schwachstellen, die die Ausführung von beliebigem Code (RCE) ermöglicht. Ein Angreifer kann den Bytestrom manipulieren und ein schädliches Objekt einschleusen.
Beispiel für einen Angriff
ObjectInputStream ois = new ObjectInputStream(request.getInputStream());Object obj = ois.readObject(); // Gefahr!Wie man sich schützt
- Deserialisieren Sie keine