rtpsw-token

20260916-201504 轮 · 看它的历史
靶子 http://localhost:20098(副本 h8,容器 wt_h8_tp8)

=== A1 · 重置码是 128 bit CSPRNG token ===
  PASS  code 是 32 位小写 hex
  PASS  code 不是 4 位数字

=== A3 · 答错一次不把缓存变成永久 ===
  PASS  发码后 TTL == 3600
  PASS  错 token → 页面报「验证码错误」
  PASS  答错后 TTL 不是 0(0 = 永久缓存)
  PASS  答错后 TTL 落在 (0, 3600]

=== A4 · 错满 6 次作废该码 ===
  PASS  第 7 次 → 页面报「错误次数过多」
  PASS  验证码缓存已被删除

=== A5 · 验证码缓存被删之后,50 秒冷却仍然生效 ===
  PASS  冷却键独立存在(未被 A4 的删除波及)
  PASS  冷却期内重发被拒 —— 没有产生新的验证码缓存

=== A2 · 守卫方向:真 token 必须换得到改密页 ===
  PASS  拿到新一轮的真 token
  PASS  真 token 不被判为「验证码错误」
  PASS  真 token 不被判为「已过期」(防「码根本没发出去」冒充通过)
  PASS  渲染出改密表单(rtpsw_s3 的 csrf_token 输入框)
  PASS  命中即消费:验证码缓存被清

=== A6 · Check50Scend 这条路仍然打不出信息 ===
  PASS  GET /Register/Check50Scend/... 不是 200
  PASS  响应体不是裸的 1/0(那就是那个邮箱存在与否的答案)

=== C1 · 两个日限计数器确实在累加 ===
  PASS  基线:正常发码成功
  PASS  邮箱日限键被创建
  PASS  IP 日限键被创建
  PASS  邮箱日限键 TTL == 86400(会自然过期,不是永久键)

=== C2 · 🔴 邮箱日限打满 → 被拒,且文案与成功【逐字相同】(反枚举) ===
  PASS  🔴 被拒响应与成功响应逐字相同(泄露不了「这个邮箱在不在」)
  PASS  🔴 真的没发出去:没有产生新的验证码缓存

=== C3 · 守卫:清掉邮箱日限键后必须立刻能发(防写成恒拒) ===
  PASS  清键后再发 → 成功
  PASS  并且真的产生了新的验证码缓存

=== C4 · IP 日限打满 → 据实报错(与邮箱无关,可以说) ===
  PASS  IP 档被拒(info==0,与邮箱档的统一文案不同)
  PASS  🔴 IP 档的响应与成功响应【不同】—— 它只取决于请求方 IP,说了不泄露东西
  PASS  IP 档被拒时也没发出去
  PASS  守卫:清掉 IP 日限键后又能发了

=== C5 · 🔴 拿不到限流锁时,这条链必须回「系统繁忙」而不是继续发码 ===
  PASS  🔴 回的是失败(info==0),没有继续往下发码
  PASS  🔴 真的没发出去:没有产生验证码缓存

PASS 31  FAIL 0