Skip to content

dogfood 真实 boot 断言只钉 max-age=30,不钉 private —— 上线到线上的那一位安全指令在唯一观测真实 wire 的那层没有被钉住 #5396

Description

@baozhoutao

发现于 #5244(showcase 注释把 cacheTtl 的响应头写成 public)的实现过程。观察类,今天没有用户会踩到,只是一处可收紧的断言,记下来交 PM 分诊。

事实

packages/qa/dogfood/test/showcase-declarative-endpoints.dogfood.test.ts:202:

expect(res.headers.get('cache-control'), 'cacheTtl: 30 must reach the wire').toMatch(/max-age=30/);

这条断言只钉 max-age=30 这一半,不钉 private / public 这一位。也就是说:如果哪天运行时把
private 翻成 public,这条真实 boot 断言仍然是绿的

private 在这条链上不是调优选择而是安全规则(packages/runtime/src/endpoint-policy.ts
computeCacheControl 文档块成文):任何一条响应都可能按调用者被 RLS 裁剪,共享缓存绝不能
存下来再发给别人。被漏钉的恰好是这条链上唯一有安全含义的那一位。

为什么仍然只算观察类,而不是缺陷

private 在下面三处是钉死的,真翻成 public 会被逮到:

  • packages/runtime/src/endpoint-policy.test.ts:312:316:331
  • packages/runtime/src/api-endpoint-step.test.ts:349:522
  • packages/runtime/src/dispatcher-plugin.endpoint-fallback.integration.test.ts:499
    (这条查的是真实 Response 头)

所以这不是一个没人守的洞,而是唯一一层观察真实 boot wire 的断言比它下面几层松。收紧它的
价值在于:单测钉的是 computeCacheControl 的返回值,dogfood 钉的是「整条栈跑完之后真正发出去
的东西」—— 中间任何一层若改写了这个头,只有 dogfood 这层看得见,而它现在看不见这一位。

修法(一行)

.toMatch(/^private, max-age=30$/)

或至少 toContain('private')。同文件 :213 那条「错误答案不得带缓存指令」的断言是对的,不用动。

边界

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions