引言
Kotlin — 一种现代编程语言,广泛用于Android应用开发、服务器端解决方案(Ktor, Spring Boot)以及跨平台项目。尽管它具有严格的类型系统和空安全特性,开发者仍常犯导致严重漏洞的错误。本文将基于OWASP标准,解析Kotlin应用十大漏洞,并展示如何避免它们。
本文对希望提升项目安全性的初级和资深Kotlin开发者均有帮助。
1. SQL注入 (SQL Injection)
问题: 通过用户输入注入恶意SQL代码。
漏洞代码示例:
// 有风险!不要使用字符串拼接fun getUserById(id: String): User? { val query = "SELECT * FROM users WHERE id = '$id'" val result = connection.createStatement().executeQuery(query) return result.toUser()}解决方案: 使用参数化查询 (PreparedStatement)。
// 安全fun getUserById(id: String): User? { val query = "SELECT * FROM users WHERE id = ?" val preparedStatement = connection.prepareStatement(query) preparedStatement.setString(1, id) val result = preparedStatement.executeQuery() return result.toUser()}2. 跨站脚本攻击 (XSS)
问题: 在网页中插入恶意JavaScript代码。
漏洞代码示例 (Ktor):
// 有风险!未转义输出get("/search") { val query = call.parameters["q"] ?: "" call.respondHtml { h1 { +"搜索结果为: $query" } // XSS! }}解决方案: 使用HTML转义(例如 kotlinx.html 的转义功能)。
// 安全import kotlinx.html.escapeHtml
get("/search") { val query = call.parameters["q"] ?: "" val safeQuery = query.escapeHtml() call.respondHtml { h1 { +"搜索结果为: $safeQuery" } }}3. 密码存储不安全
问题: 明文存储密码或使用弱哈希算法 (MD5, SHA-1)。
漏洞代码示例:
// 有风险!MD5不适合用于密码fun saveUser(password: String) { val hash = MessageDigest.getInstance("MD5").digest(password.toByteArray()) // 将hash存入数据库}解决方案: 使用bcrypt, scrypt 或 Argon2。
// 安全 (使用jbcrypt库)import org.mindrot.jbcrypt.BCrypt
fun hashPassword(password: String): String { return BCrypt.hashpw(password, BCrypt.gensalt(12))}
fun checkPassword(password: String, hashed: String): Boolean { return BCrypt.checkpw(password, hashed)}4. 通过日志泄露敏感数据
问题: 记录密码、令牌、卡号等敏感信息。
漏洞代码示例:
// 有风险!记录了敏感数据fun login(username: String, password: String) { log.info("登录尝试: username=$username, password=$password")}解决方案: 使用过滤器或掩码处理。
// 安全fun login(username: String, password: String) { log.info("登录尝试: username=$username") // 不记录password}5. 不安全的反序列化
问题: 反序列化未经验证的数据时执行任意代码。
漏洞代码示例:
// 有风险!未经验证的反序列化fun process