Sicherheit von Kotlin-Anwendungen: Top-10 Schwachstellen für Anfänger
Kotlin ist eine moderne Programmiersprache, die aktiv für die Entwicklung von Android-Apps, Serverlösungen und plattformübergreifenden Projekten eingesetzt wird. Doch trotz seiner strengen Typisierung und standardmäßigen Sicherheit machen Anfänger oft Fehler, die zu ernsthaften Sicherheitslücken führen können. In diesem Artikel analysieren wir die Top-10 der häufigsten Sicherheitsprobleme in Kotlin-Anwendungen, zeigen Beispiele für gefährlichen Code und geben Empfehlungen zu deren Behebung.
1. SQL-Injection
Eine der ältesten und gefährlichsten Schwachstellen. Wenn Sie Benutzereingaben direkt in SQL-Abfragen einfügen, kann ein Angreifer beliebige Befehle ausführen.
// GEFÄHRLICH: Zeichenkettenverkettungval query = "SELECT * FROM users WHERE name = '$userInput'"statement.executeQuery(query)
// SICHER: Verwendung parametrisierter Abfragenval query = "SELECT * FROM users WHERE name = ?"val preparedStatement = connection.prepareStatement(query)preparedStatement.setString(1, userInput)preparedStatement.executeQuery()2. Unsichere Speicherung von Passwörtern
Speichern Sie Passwörter niemals im Klartext. Verwenden Sie bcrypt, Argon2 oder PBKDF2. In Kotlin können Sie dafür die Bibliothek spring-security-crypto oder kotlinx-serialization mit Hashing verwenden.
// GEFÄHRLICH: Speicherung im Klartextdata class User(val password: String)
// SICHER: Hashing mit Saltimport org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder
val encoder = BCryptPasswordEncoder()val hashedPassword = encoder.encode(plainPassword)3. Fehlende Eingabevalidierung (Input Validation)
Alle Daten von Benutzern müssen validiert werden. Die Missachtung dieser Regel führt zu XSS, Injection und DoS-Angriffen.
// GEFÄHRLICH: Direkte Ausgabe ohne Escapingfun renderHtml(userInput: String): String { return "<div>$userInput</div>"}
// SICHER: HTML-Escapingimport org.owasp.encoder.Encode
fun renderSafeHtml(userInput: String): String { return "<div>${Encode.forHtml(userInput)}</div>"}4. Schwachstellen bei der Datenserialisierung
Kotlin verwendet kotlinx.serialization oder Gson/Moshi. Eine falsche Konfiguration kann zur Offenlegung sensibler Daten oder zur Remote Code Execution führen.
// GEFÄHRLICH: Serialisierung aller Felder@Serializabledata class User( val name: String, val passwordHash: String // Hash-Leck!)
// SICHER: Ausschluss sensibler Felder@Serializabledata class SafeUser( val name: String, @Transient val passwordHash: String = "")5. Unsichere Verwendung von WebView (Android)
Bei der Entwicklung von Android-Apps mit Kotlin wird häufig WebView verwendet. Wenn JavaScript nicht deaktiviert oder die Filterung nicht konfiguriert wird, sind XSS-Angriffe möglich.
// GEFÄHRLICH: JavaScript ohne Filterung aktiviertwebView.settings.javaScriptEnabled = truewebView.loadUrl("file:///android_asset/index.html")
// SICHER: JavaScript für statische Inhalte deaktivierenwebView.settings.javaScriptEnabled = false// Oder Content Security Policy verwendenwebView.loadDataWithBaseURL(null, content, "text/html", "UTF-8", null)6. Fehlerhaftes Session-Management
Die Speicherung von Authentifizierungstoken in SharedPreferences ohne Verschlüsselung ist ein häufiger Fehler. Verwenden Sie EncryptedSharedPreferences oder den Android Keystore.
// GEFÄHRLICH: Offene Token-Speicherungval prefs = context.getSharedPreferences("auth", Context.MODE_PRIVATE)prefs.edit().putString("token", token).apply()
// SICHER: Verschlüsselte Speicherungval encryptedPrefs = EncryptedSharedPreferences.create( "secure_prefs", MasterKey.DEFAULT_MASTER_KEY_ALIAS, contex