Kotlin 应用程序安全:初学者必知的十大漏洞

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Kotlin 应用程序安全:初学者必知的十大漏洞

\n\n

Kotlin 是一种现代编程语言,广泛用于 Android 应用开发、服务器端解决方案(Ktor、Spring Boot)甚至前端开发(Kotlin/JS)。然而,与其他任何语言一样,Kotlin 也存在漏洞,尤其是对于刚起步的开发者而言。在本文中,我们将分析 Kotlin 应用程序的十大漏洞,这是每位初学者开发者都应了解的。我们将提供代码示例并给出实用的修复建议。

\n\n

1. 忽略空安全(Null Safety)

\n

Kotlin 以其安全的空值处理(Null Safety)而闻名。然而,新手经常使用 !! 操作符(非空断言),这会导致 NullPointerException。

\n
// 糟糕:存在 NPE 风险\nval name: String? = null\nprintln(name!!.length)\n\n// 良好:安全调用\nprintln(name?.length ?: "名字不存在")
\n

建议: 避免使用 !!。请使用 Elvis 操作符(?:)或 let/also。

\n\n

2. 不安全地存储机密(硬编码机密)

\n

将 API 密钥、令牌和密码直接存储在代码中是一个严重错误。攻击者可以轻松从 APK 文件中提取它们。

\n
// 糟糕:令牌写在代码中\nval apiToken = "sk-1234567890abcdef"\n\n// 良好:使用 BuildConfig 或 NDK\n// 在 build.gradle 中:buildConfigField "String", "API_TOKEN", "\\"${apiToken}\\""
\n

建议: 使用环境变量、BuildConfig 或安全存储(Android Keystore)。

\n\n

3. Android 中的 SQL 注入(Room/Exposed)

\n

即使使用 ORM(对象关系映射),如果使用字符串拼接的原始 SQL 查询,也可能导致注入。

\n
// 糟糕:易受注入攻击\nval query = "SELECT * FROM users WHERE name = '$userInput'"\n\n// 良好:参数化查询\nval query = "SELECT * FROM users WHERE name = ?"\nval cursor = db.rawQuery(query, arrayOf(userInput))
\n

建议: 始终使用参数化查询或安全 API(Room 的 @Query 带参数)。

\n\n

4. 不安全的日志记录

\n

在生产环境中记录敏感数据(密码、卡号)可能导致信息泄露。

\n
// 糟糕:记录密码\nLog.d("Auth", "用户密码:$password")\n\n// 良好:仅记录事实\nLog.d("Auth", "用户认证尝试")
\n

建议: 使用日志级别和过滤器。在生产环境中禁用 Log.v 和 Log.d。

\n\n

5. 错误使用 SharedPreferences

\n

SharedPreferences 默认将数据以未加密的 XML 文件形式存储。如果设备已 root,攻击者可以访问这些数据。

\n
// 糟糕:普通 SharedPreferences\nval prefs = context.getSharedPreferences("app_prefs", Context.MODE_PRIVATE)\n\n// 良好:EncryptedSharedPreferences(AndroidX Security)\nval masterKey = MasterKey.Builder(context)\n    .setKeyScheme(MasterKey.KeyScheme.AES256_GCM)\n    .build()\nval encryptedPrefs = EncryptedSharedPreferences.create(\n    context, "secure_prefs", masterKey,\n    EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,\n    EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM\n)
\n

建议: 对于敏感数据,请使用 EncryptedSharedPreferences 或带加密的 DataStore。

\n\n

6. 反序列化漏洞(JSON/Gson/Moshi)

\n

反序列化不可信数据时,可能导致任意代码执行或内存泄露。

\n
// 糟糕:使用 Gson 且未验证\nval user = Gson().fromJson(jsonString, User::class.java)\n\n// 良好:验证                

博客

书籍推荐