ratelimit-ip-identity

20260916-181749 轮 · 看它的历史
=== W1 · get_client_ip 不再把 IPv6 折叠成 0.0.0.0 ===
  PASS  IPv6 原样返回
  PASS  IPv6 的整数形态返 0(它对 IPv6 没定义)
  PASS  守卫:IPv4 不变
  PASS  守卫:非法串仍归 0.0.0.0
  PASS  IPv4 映射形态(::ffff:a.b.c.d)还原成 IPv4

=== W2 · rateLimitIpBucket:IPv6 按 /64,IPv4 原样,非法归 invalid ===
  PASS  /64 前缀
  PASS  🔴 同一 /64 的两个地址落同一桶
  PASS  🔴 不同 /64 不同桶
  PASS  IPv4 原样
  PASS  非法串归 invalid(一起被限,不是各自免检)
  PASS  🔴 IPv4 映射形态按各自的 IPv4 分桶(不是一起落进 ::/64)

=== W3 · 不可信 REMOTE_ADDR:X-Forwarded-For 一个字都不看(伪造无效) ===
  PASS  🔴 键按 REMOTE_ADDR 算,不按伪造的 XFF
  PASS  🔴 登录失败 IP 桶同款(原 client 源裸信 XFF,已改 remote)

=== W4 · 可信代理:沿 X-Forwarded-For 从右往左取第一个不可信地址 ===
  PASS  单跳:取 XFF 里的客户端
  PASS  两跳(右边那跳也是可信代理):跳过它取 9.9.9.9
  PASS  🔴 右边第一个不可信就是客户端,更左的 6.6.6.6 是它自己写的不采信
  PASS  XFF 里的 IPv6 也按 /64 分桶
  PASS  守卫:链上全是可信代理 → 回落 REMOTE_ADDR
  PASS  守卫:XFF 不是合法 IP → 回落 REMOTE_ADDR(不让一个坏头变成任意键)
  PASS  CIDR 形式的名单也认
  PASS  🔴 双栈代理写成 ::ffff: 形态:REMOTE_ADDR 仍匹配 IPv4 名单,XFF 客户端按 IPv4 分桶

=== W5 · https 判定用同一份名单 ===
  PASS  可信代理 + X-Forwarded-Proto=https → 是 https
  PASS  守卫:名单空 → 不信那个头

=== H · WxAuth/login:同一 /64 五次输错 → 第六个地址被锁;别的 /64 与 IPv4 不被锁 ===
  PASS  A 段第 1 个地址:还没锁(实得「login failed」)
  PASS  A 段第 2 个地址:还没锁(实得「login failed」)
  PASS  A 段第 3 个地址:还没锁(实得「login failed」)
  PASS  A 段第 4 个地址:还没锁(实得「login failed」)
  PASS  A 段第 5 个地址:还没锁(实得「login failed」)
  PASS  🔴 A 段第 6 个地址(同 /64)被锁
  PASS  🔴 守卫:另一个 /64 不被锁
  PASS  🔴 守卫:IPv4 来源不被锁
  · .env 已还原(逐字节相同:true);清理限流桶:ok

PASS 31  FAIL 0