标准答案

  1. 服务端从登录态、令牌声明、域名、服务身份或受控切换流程建立当前租户上下文,并校验主体是否有切换到该租户的权限。
  2. 所有查询和写入都要自动带上租户范围,使用 repository、ORM scope、数据库行级安全或独立库表等机制减少遗漏;关键表应有租户列和复合唯一约束。
  3. 按风险和规模选择共享表、独立 schema、独立数据库或独立账号等隔离方式,并为备份、迁移、审计和故障恢复保留边界。
  4. 缓存键、对象存储路径、消息主题、搜索索引、导出文件和后台任务都要包含可信租户维度,避免跨租户命中或消费。
  5. 通过越权测试、租户切换审计、随机抽检和监控检测隔离失效;仅靠前端隐藏租户选择器没有安全意义。

题目解析

tenantId 是业务输入,不是授权凭据。攻击者修改 URL、body 或 Header 中的 tenantId 后,服务端仍必须以当前身份允许的范围决定查询条件。

多租户漏洞常出现在边缘系统:缓存、导出、异步任务和搜索索引比主数据库更容易遗漏租户过滤。

常见误区

  • 直接使用请求中的 tenantId 拼查询条件,没有验证当前用户归属。
  • 主表做了租户过滤,缓存和对象存储路径却没有隔离。
  • 把管理员角色理解为可以无审计地访问所有租户数据。

作者信息