SEC-005 P1: UserDefaults 儲存敏感使用者標識
Resolved 💬 2 comments Opened Mar 22, 2026 by stephen-taipei Closed Mar 25, 2026
問題描述
ReferralManager 的 getUserId() 方法將已驗證使用者 ID 和生成的 UUID 儲存在 UserDefaults 中。UserDefaults 的加密不如 Keychain,該 ID 可能被其他應用程式讀取。
檔案位置
ios-swift/Connectors/Managers/ReferralManager.swift:574-582
詳細說明
private func getUserId() -> String {
if let authenticatedUserId = AuthManager.shared.currentUser?.id {
UserDefaults.standard.set(authenticatedUserId, forKey: "user_id") // 不安全
return authenticatedUserId
}
if let userId = UserDefaults.standard.string(forKey: "user_id") {
return userId
}
let newUserId = UUID().uuidString
UserDefaults.standard.set(newUserId, forKey: "user_id") // 不安全
return newUserId
}
風險評估
- UserDefaults 在備份中明文存儲
- Xcode debugger 可直接訪問
- 其他應用可能在特定環境下讀取
- 使用者 ID 洩漏可能導致帳戶盜用
解決方案
- 使用 Keychain 替換 UserDefaults 存儲使用者 ID
- 已驗證使用者 ID 應由伺服器分配,不應本地生成
- 若必須本地生成,應通過伺服器驗證同步
- 定期清除過期的本地 ID
This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗