Segurança de aplicações Kotlin: top-10 vulnerabilidades para iniciantes
Kotlin é uma linguagem de programação moderna, ativamente utilizada para criar aplicações Android, soluções de servidor e projetos multiplataforma. No entanto, mesmo com sua tipagem estrita e segurança por padrão, desenvolvedores iniciantes frequentemente cometem erros que podem levar a vulnerabilidades graves. Neste artigo, vamos analisar o top-10 dos problemas de segurança mais comuns em aplicações Kotlin, mostrar exemplos de código perigoso e dar recomendações para corrigi-los.
1. SQL Injection
Uma das vulnerabilidades mais antigas e perigosas. Se você concatenar diretamente a entrada do usuário em uma consulta SQL, um invasor pode executar comandos arbitrários.
// PERIGOSO: concatenação de stringsval 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. Armazenamento inseguro de senhas
Nunca armazene senhas em texto simples. Use bcrypt, Argon2 ou PBKDF2. Em Kotlin, você pode usar a biblioteca spring-security-crypto ou kotlinx-serialization com hashing.
// PERIGOSO: armazenamento em plain textdata class User(val password: String)
// SEGURO: hashing com saltimport org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder
val encoder = BCryptPasswordEncoder()val hashedPassword = encoder.encode(plainPassword)3. Falta de validação de entrada (Input Validation)
Quaisquer dados do usuário devem passar por validação. Ignorar esta regra leva a XSS, injeções e ataques DoS.
// PERIGOSO: saída direta sem 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 na serialização de dados
Kotlin usa kotlinx.serialization ou Gson/Moshi. Uma configuração incorreta pode levar à exposição de dados sensíveis ou execução remota de código.
// PERIGOSO: serialização de todos os campos@Serializabledata class User( val name: String, val passwordHash: String // vazamento de hash!)
// SEGURO: exclusão de campos sensíveis@Serializabledata class SafeUser( val name: String, @Transient val passwordHash: String = "")5. Uso inseguro de WebView (Android)
Ao desenvolver aplicações Android em Kotlin, WebView é frequentemente usado. Se você não desabilitar JavaScript ou não configurar a filtragem, um ataque XSS é possível.
// PERIGOSO: JavaScript ativado sem filtragemwebView.settings.javaScriptEnabled = truewebView.loadUrl("file:///android_asset/index.html")
// SEGURO: desabilitar JavaScript para conteúdo estáticowebView.settings.javaScriptEnabled = false// Ou usar Content Security PolicywebView.loadDataWithBaseURL(null, content, "text/html", "UTF-8", null)6. Gerenciamento incorreto de sessões
Armazenar tokens de autenticação em SharedPreferences sem criptografia é um erro comum. Use EncryptedSharedPreferences ou Android Keystore.
// PERIGOSO: armazenamento aberto do tokenval prefs = context.getSharedPreferences("auth", Context.MODE_PRIVATE)prefs.edit().putString("token", token).apply()
// SEGURO: armazenamento criptografadoval encryptedPrefs = EncryptedSharedPreferences.create( "secure_prefs", MasterKey.DEFAULT_MASTER_KEY_ALIAS, contex