代表性面试主题

通用面试题:能力 URL 什么时候适用,如何做到可撤销?

通用困难
Offer.cc 编辑团队发布 更新

题干

你要分享一个只有拿到链接才能访问的资源。什么时候可以使用能力 URL?如何限制泄露影响并实现精确撤销?

1. 题目与使用场景

产品需要让用户分享发票、文件或一次性操作。链接本身携带访问能力,服务端不必先识别登录账户。面试重点是判断这种设计何时合理,以及如何面对链接被复制、记录或转发的现实风险。

2. 面试官考察点

  • 能否区分能力 URL、登录会话和 OAuth bearer token 的信任模型。
  • 是否把 URL 泄露路径纳入威胁模型:日志、历史记录、分析系统、Referer 和截图。
  • 是否设计短时效、最小权限、单次使用或绑定受众的令牌。
  • 是否提供按链接撤销、批量撤销和审计能力,而不是只能轮换全局密钥。

W3C 的能力 URL指南强调,泄露后必须能撤销原先授予的权限。OWASP 明确建议不要把密码、API key 或安全令牌放在 URL 中;因此使用能力 URL 必须有清晰的风险边界和补偿控制。

3. 回答前需要澄清的问题

  1. 资源是公开、低敏感,还是包含个人、财务或合规数据?
  2. 访问者是否必须登录,链接是否需要跨组织转发?
  3. 访问是一次性下载、限定时间窗口,还是长期协作?
  4. 泄露后需要撤销单条链接、某个用户,还是整个资源?

4. 30 秒回答框架

用“适用性—令牌—泄露—撤销—替代方案”回答:

我只把能力 URL 用于低频、可审计且允许持有者访问的资源,并把令牌限制到单个资源和短时间窗口。令牌必须高熵、不可猜测,服务端只存哈希并记录创建、使用和撤销状态;同时设置 Referrer-Policy: no-referrer,避免把它放入日志或第三方分析。敏感资源改用登录授权,能力 URL 只作为一次性邀请或下载凭证。

5. 分步骤深入解答

第一步:选择合适的信任模型

能力 URL 是“持有链接即拥有权限”,不是证明某个账户身份。它适合分享低敏感资源、一次性下载或无需注册的邀请;不适合需要细粒度成员权限、长期审计或强身份保证的操作。若需要 OAuth bearer token,应优先使用 Authorization 请求头;RFC 6750 将 URI 查询参数列为可用但风险更高的传递方式。

第二步:缩小令牌的能力

令牌至少绑定资源 ID、动作和受众。设置短过期时间、单次使用标记和速率限制;对可转发场景可增加收件人确认或登录后再兑换。令牌使用加密随机数生成,数据库保存哈希,避免数据库泄露直接变成可用凭证。

第三步:控制 URL 泄露面

OWASP 提醒,URL 会进入服务器日志、浏览器历史和代理记录。落地页收到令牌后应尽快通过安全请求交换为短期会话,并清理地址栏;设置严格的 Referer 策略,不把令牌发给第三方资源。邮件、截图和聊天工具仍可能暴露链接,因此不要把长期高权限放进去。

第四步:实现精确撤销与审计

为每个令牌记录创建者、资源、动作、过期时间、最后使用时间和撤销时间。撤销检查应在每次兑换或下载前执行;单条链接撤销不能依赖轮换全局密钥。审计日志记录成功、失败、重复使用和撤销原因,帮助识别泄露与滥用。

6. 高质量示范回答

我会先判断资源敏感度和访问生命周期。公开手册不需要能力 URL;一份供外部审阅的低敏感发票可以使用,但高敏感财务报表应要求登录和组织权限。

>

对可用场景,我生成至少 128 位的随机令牌,并让它只对应一个资源、一个动作和一个 24 小时窗口。数据库只保存令牌哈希、状态和审计字段;兑换成功后立即标记使用,下载接口每次都检查过期和撤销状态。响应设置 Referrer-Policy: no-referrer,兑换后把令牌从地址栏移除,页面不加载会向第三方发送 Referer 的资源。

>

用户可以撤销单条链接,管理员可以按资源批量撤销;撤销和重复使用都会写入审计日志。若业务后来需要长期协作,我会迁移到登录授权和成员权限,而不是把能力 URL 延长为永久 bearer token。这样既保留分享便利,也把泄露影响限制在单个资源和有限时间内。

7. 常见错误

  • 把“链接很长”当成安全性,忽略日志、历史记录和转发泄露。
  • 使用可预测的资源 ID 或自增 token。
  • 把长期、高权限 bearer token 放在查询参数中。
  • 只有全局密钥轮换,没有单条链接撤销。
  • 令牌兑换后仍让它留在地址栏,并加载第三方图片或分析脚本。

8. 追问及应对

追问一:为什么数据库只保存令牌哈希?

令牌是持有者凭证,数据库读权限一旦泄露,明文令牌会立即可用。保存哈希后,服务端可以对提交值做同样哈希比对,降低静态数据泄露影响。

追问二:单次使用会不会导致用户刷新失败?

把一次性令牌用于兑换短期会话,页面刷新使用会话而不是重复兑换原链接;若兑换成功但响应丢失,可提供受限的幂等兑换结果,而不重新开放长期能力。

追问三:何时应完全放弃能力 URL?

当资源高敏感、需要持续成员管理、必须证明访问者身份,或组织要求集中撤销与审计时,使用登录授权和服务端权限模型更合适。

公开来源

同类题目