
评审心理普查平台时,看到数据库主键采用自增 ID,不能只凭这一项判断安全性。还要确认编号是否进入报告链接,服务端如何决定谁能看哪份报告,导出数据能否关联到个人。
这些问题分别属于内部主键、公开标识、对象级授权、审计和脱敏。Snowflake 负责分布式唯一发号,也能降低连续编号带来的枚举便利,但无法独自承担其余职责。
内部主键与公开标识可以分开
内部主键用于数据库关联和索引。单库或统一发号的系统可以使用自增 ID;多节点需要各自生成全局唯一编号时,可以选用 Snowflake。它把时间、数据中心、工作节点和毫秒内序列组合成长整型 ID。
Snowflake ID 大致随时间递增,并带有时间和节点结构,仍不属于随机标识。连续自增值出现在 URL 中,会让编号更容易猜,也可能暴露记录先后;删除、预留号和共享序列会使编号差值偏离真实用户数。
公开标识用于 URL、API 参数和下载任务,可以与内部主键建立映射。平台可选用难猜的随机标识,也可把 Snowflake 作为较难连续枚举的业务 ID。公开标识只负责定位对象,不能充当访问凭据。
报告能否打开,由逐对象授权决定
访问者登录后,服务端仍要对每次查看、下载、修改、删除和导出执行对象级授权。检查应落到具体业务关系,例如账号所属机构、负责的学生或班级、角色和报告状态。修改 ID 只是探测动作,服务端错误放行才会形成对象级越权,也就是 BOLA。
认证确认“谁在访问”,对象级授权决定“能否操作这份档案”。审计记录访问主体、时间、对象、动作和结果;监控识别大量试号、连续跨机构失败等模式。复杂标识、授权、审计和监控各有职责。
脱敏处理的是数据与个人的关联
把主键换成 Snowflake 后,姓名、手机号、学校、班级、作答记录和报告内容仍可能指向个人。脱敏需要处理直接标识和组合关联,并结合最小披露、映射关系隔离、访问权限和导出范围降低重新识别风险。
评审橙星云这类心理测评系统时,应沿数据流检查:内部怎样关联记录,接口暴露什么标识,每个端点怎样授权,敏感字段怎样展示或导出,访问能否审计。只看主键类型,覆盖不了档案从存储到访问的安全过程。
大整数跨接口时要明确类型契约
Snowflake 常用 64 位长整型,可能超过 JavaScript Number 的安全整数上限 2^53 - 1。标识符经 JSON 交给前端后,一旦按 Number 解析,末位可能改变,报告查询也会指向错误对象。
面向浏览器和多种客户端的 API,通常把这类标识符按字符串传输,并统一接口文档、服务端序列化、前端类型和日志。封闭链路也可使用 BigInt 或专用解析库;全局转换所有 Long 会影响计数、金额等字段,应按标识符字段制定契约。
选型可按职责落地:单库主键可以使用自增 ID;分布式发号可以评估 Snowflake;报告和档案使用难猜的公开标识,每个端点执行对象级授权;共享或导出数据单独脱敏;审计与监控覆盖访问过程。主键方案只是隐私安全方案中的一层。
参考资料
- OWASP API1:2023 Broken Object Level Authorization
- OWASP Insecure Direct Object Reference Prevention Cheat Sheet
- Twitter Snowflake 2010 IdWorker 源码
- NISTIR 8053: De-Identification of Personal Information
- ECMAScript Number.MAX_SAFE_INTEGER;RFC 8259: The JavaScript Object Notation Data Interchange Format
