uni-app 跨端应用的安全设计集中在本地存储加密、通信保护、权限最小化和隐私合规。本文从工程实践出发,分析敏感数据隔离、证书固定、日志脱敏和合规审核等关键问题,帮助团队在开发阶段建立可落地的安全基线。

软件定制开发团队
"真正有价值的技术内容,应该能帮助客户更快判断方向、预算和落地路径。"
uni-app 的跨端特性让团队能用一套代码同时输出 iOS、Android、H5 和各平台小程序,但这也意味着安全设计必须覆盖多个运行时环境。很多团队在初期只关注业务功能,等到应用上线后才发现:本地存储的 Token 被其他应用读取、HTTPS 证书校验被中间人绕过、权限申请弹窗被用户拒绝后功能异常、日志中明文记录了用户手机号。
这些问题在单一平台开发中已经需要重视,在跨端场景下更复杂——每个平台对存储隔离、网络栈、权限模型和隐私合规的要求都不同。本文从本地存储、通信保护、权限管理和隐私合规四个维度展开,只讨论工程中能直接落地的做法。
在 uni-app 中,所有通过 `uni.setStorageSync` 写入的数据都存放在各平台默认的本地存储区域。但不同平台对这块区域的保护力度差异很大:
因此,不能把“平台默认安全”当作安全策略。必须对数据分级处理:
我们曾在项目中遇到一个典型问题:Token 存储在 `uni.setStorageSync` 中,测试时发现 Android 设备上通过 adb 备份可以导出所有 SharedPreferences 文件。解决方案是为 Android 端集成了 `androidx.security.crypto.EncryptedSharedPreferences`,iOS 端使用 Keychain 存储。uni-app 端通过自定义插件暴露 `setSecureStorage(key, value)` 和 `getSecureStorage(key)` 两个接口。
需要注意,跨端条件下无法保证所有平台都有等价的加密存储能力。小程序端无法使用原生 Keychain,所以高敏感数据在小程序中应改为每次从服务端获取,不在本地持久化。
一个常见错误是把整个用户对象(包含手机号、身份证、地址)一次性存到本地。正确的做法是只存储业务必须的标识和 Token,其他数据通过接口按需获取。这样即使本地存储被攻破,泄露的信息也有限。
大多数 uni-app 应用使用 `uni.request` 发起网络请求,默认走 HTTPS。但默认的 HTTPS 只验证系统根证书链,如果设备安装了恶意根证书(例如企业代理、抓包工具),中间人攻击依然有效。对于金融、支付或涉及用户敏感数据的场景,必须实施证书固定(Certificate Pinning)。
uni-app 的 `uni.request` 不直接支持证书固定。通用做法有两种:
我们在一款金融类 APP 中采用了第一种方案:后端提供证书公钥的 SHA-256 指纹,原生插件在连接建立时校验服务端证书指纹是否匹配。如果指纹不匹配,直接断开连接并返回错误码。uni-app 端只需调用一个 `setSSLPinning(fingerprint)` 方法,出错时提示用户网络不安全。
需要注意,证书有有效期,指纹更新需要与应用版本同步,否则会导致用户无法正常使用。建议在服务端保留至少两个有效的证书指纹,并在应用内预置一组备用指纹,通过接口动态更新。
即使使用 HTTPS,请求参数和响应数据在应用内存中仍然是明文。如果应用被 Hook 或动态调试,攻击者可以读取这些数据。对于高度敏感的场景(如支付签名、用户密码),建议在应用层再做一层加密:
这层加密会增加开发和调试成本,只建议在涉及资金、个人敏感信息或核心业务逻辑的接口上使用。
uni-app 封装了 `uni.authorize`、`uni.getLocation` 等 API,但底层权限模型各平台不同:
不要在一开始就申请所有权限。正确的做法是:
1. 在用户触发需要权限的功能时,先通过弹窗说明为什么需要这个权限,例如“我们需要访问您的位置以显示附近的商家”。
2. 用户确认后,再调用 `uni.authorize` 或对应平台 API。
3. 如果用户拒绝,不要反复弹窗。记录拒绝状态,在用户再次使用该功能时,提供“前往设置”的引导按钮。
在 uni-app 中,可以通过 `uni.getSetting` 检查权限状态,判断是“未申请”“已授权”还是“已拒绝”。根据状态决定下一步行为。
国内各应用商店(尤其是苹果 App Store 和华为应用市场)对权限申请有严格审核。常见违规行为包括:
在 uni-app 项目中,建议在开发阶段就维护一份权限清单,列出每个权限对应的业务场景和用途,并在隐私政策中明确说明。上线前使用各平台的合规检测工具(如腾讯的隐私合规检测)进行扫描。
开发阶段,`console.log` 是调试利器,但很多团队在发布时忘记移除或关闭日志输出。这些日志如果包含用户数据、Token、接口返回信息,一旦被攻击者通过日志收集工具(如 Android 的 logcat)读取,就是直接的数据泄露。
uni-app 项目可以通过以下方式控制日志:
很多应用集成了错误监控 SDK(如 Sentry、Bugly),这些 SDK 默认会上报错误堆栈和应用状态。如果错误发生时,堆栈中包含了用户输入或接口返回数据,这些数据会随错误信息一起上传到第三方服务器。
建议在初始化错误监控 SDK 时,配置数据过滤规则。例如,过滤掉所有包含 `password`、`token`、`phone` 字段的变量值。uni-app 中可以通过插件或自定义上报逻辑实现。
不同平台对隐私政策的展示方式和内容要求不同:
uni-app 项目需要为每个平台单独配置隐私政策的展示逻辑。建议在应用启动时统一检测,如果用户未同意隐私政策,阻止所有数据收集和网络请求。
如果应用使用了海外云服务(如 AWS、Google Cloud),或者用户数据会传输到境外服务器,必须在隐私政策中明确说明,并获得用户同意。这点在跨端应用中容易被忽略,尤其是 H5 版本通过 CDN 加载资源时,用户 IP 可能被 CDN 服务商记录。
我们曾协助一个客户处理应用商店审核被拒的问题,原因是应用在用户未同意隐私政策前就调用了 `uni.getSystemInfo` 获取设备信息。解决方案是在应用启动时先展示隐私政策弹窗,用户同意后再初始化 SDK 和获取设备信息。这个改动看似简单,但需要从代码架构层面调整初始化顺序。
在 uni-app 项目中,建议在上线前进行以下检查:
对于持续迭代的项目,可以将安全检查集成到 CI/CD 流程中。例如,每次构建后自动运行 MobSF 扫描,如果发现高风险问题则阻止发布。这项工作需要一定的配置成本,但对于企业级应用来说值得投入。
uni-app 跨端应用的安全设计不是简单套用一套方案就能覆盖所有平台。每类数据(本地存储、通信、权限、日志)都需要针对不同平台的特性做差异化处理。核心原则只有三条:最小化数据存储、加密敏感信息、按需申请权限。在开发阶段就把这些策略写进代码,比上线后发现问题再修复的成本低得多。
在 SystemDo 的多个跨端项目中,我们总结的经验是:安全设计从架构阶段开始,每个平台独立验证,同时保持代码层面的统一接口。这样既能保证安全效果,也能维持开发效率。
继续了解企业数字化、SEO / GEO、AI 自动化和软件定制开发中的常见问题。