Seguridad de aplicaciones Kotlin: top-10 vulnerabilidades para principiantes
Kotlin es un lenguaje de programación moderno que se utiliza activamente para crear aplicaciones Android, soluciones de servidor y proyectos multiplataforma. Sin embargo, incluso con su tipado estricto y seguridad por defecto, los desarrolladores novatos suelen cometer errores que pueden provocar vulnerabilidades graves. En este artículo analizaremos el top-10 de los problemas de seguridad más comunes en aplicaciones Kotlin, mostraremos ejemplos de código peligroso y daremos recomendaciones para solucionarlos.
1. Inyección SQL (SQL Injection)
Una de las vulnerabilidades más antiguas y peligrosas. Si concatenas directamente la entrada del usuario en una consulta SQL, un atacante puede ejecutar comandos arbitrarios.
// PELIGROSO: concatenación de cadenasval query = "SELECT * FROM users WHERE name = '$userInput'"statement.executeQuery(query)
// SEGURO: uso de consultas parametrizadasval query = "SELECT * FROM users WHERE name = ?"val preparedStatement = connection.prepareStatement(query)preparedStatement.setString(1, userInput)preparedStatement.executeQuery()2. Almacenamiento inseguro de contraseñas
Nunca almacenes contraseñas en texto plano. Usa bcrypt, Argon2 o PBKDF2. En Kotlin puedes usar la librería spring-security-crypto o kotlinx-serialization con hashing.
// PELIGROSO: almacenamiento en texto planodata class User(val password: String)
// SEGURO: hashing con salimport org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder
val encoder = BCryptPasswordEncoder()val hashedPassword = encoder.encode(plainPassword)3. Falta de validación de entrada (Input Validation)
Cualquier dato del usuario debe pasar validación. Ignorar esta regla lleva a XSS, inyecciones y ataques DoS.
// PELIGROSO: salida directa sin escapefun renderHtml(userInput: String): String { return "<div>$userInput</div>"}
// SEGURO: escape HTMLimport org.owasp.encoder.Encode
fun renderSafeHtml(userInput: String): String { return "<div>${Encode.forHtml(userInput)}</div>"}4. Vulnerabilidades en serialización de datos
Kotlin usa kotlinx.serialization o Gson/Moshi. Una configuración incorrecta puede provocar la exposición de datos sensibles o ejecución remota de código.
// PELIGROSO: serialización de todos los campos@Serializabledata class User( val name: String, val passwordHash: String // ¡fuga del hash!)
// SEGURO: exclusión de campos sensibles@Serializabledata class SafeUser( val name: String, @Transient val passwordHash: String = "")5. Uso inseguro de WebView (Android)
Al desarrollar aplicaciones Android en Kotlin, a menudo se usa WebView. Si no se desactiva JavaScript o no se configura el filtrado, es posible un ataque XSS.
// PELIGROSO: JavaScript habilitado sin filtradowebView.settings.javaScriptEnabled = truewebView.loadUrl("file:///android_asset/index.html")
// SEGURO: desactivamos JavaScript para contenido estáticowebView.settings.javaScriptEnabled = false// O usamos Content Security PolicywebView.loadDataWithBaseURL(null, content, "text/html", "UTF-8", null)6. Gestión incorrecta de sesiones
Almacenar tokens de autenticación en SharedPreferences sin cifrado es un error común. Usa EncryptedSharedPreferences o Android Keystore.
// PELIGROSO: almacenamiento abierto del tokenval prefs = context.getSharedPreferences("auth", Context.MODE_PRIVATE)prefs.edit().putString("token", token).apply()
// SEGURO: almacenamiento cifradoval encryptedPrefs = EncryptedSharedPreferences.create( "secure_prefs", MasterKey.DEFAULT_MASTER_KEY_ALIAS, contex