TEST — Rule #3 (Chống spam) & #4 (Chặn tay IP/CIDR)

Campaign Điểm thi · GEARVN OPS · DOC-QA-TC v1.1 · 2026-06-26 · §3a ĐÃ CHẠY (test-rate-limit.mjs)

§3a Rate-limit §3b Trần voucher/IP/giờ §4 Blocklist IP/CIDR 12 test case

⚠️ Phát hiện then chốt

Trang admin "Chính sách & Rule" là spec mong muốn. Đối chiếu code repo 5b876f5: §3b và §4 CHƯA được implement → không có "kết quả pass" thật cho 2 phần này. Bản deployed worker có thể mới hơn repo.
RuleSpec trên trangTrong code repoVerdict
§3a — cơ chế rate-limit 6 scopecó (env RL_*) (rate-limit.ts)✅ Có
§3a — giá trị defaultscore-ip 120/60, claim-phone 5/600…score-ip 20/60, claim-phone 3/600…⚠️ Lệch (env override được)
§3b — trần voucher/IP/giờ (RL_ISSUE_IP, ISSUE_LIMIT)có (40/3600)KHÔNG (grep rỗng; enum ClaimStatus không có ISSUE_LIMIT)❌ Chưa làm
§4 — blocklist blocked_ips + CIDR + BLOCKED 403KHÔNG (không route nào trả 403)❌ Chưa làm
§4/§5 — lưu source_ip_plain + ADMIN_SHOW_PIIchỉ lưu sourceIpHash (hash)❌ Chưa làm

Điều kiện chạy động: rate-limit/blocklist chỉ enforce trên deployed worker (cần KV RATE_LIMIT_KV); local fail-open (luôn qua). CAPTCHA: CAPTCHA_PROVIDER=none hoặc Turnstile test token.

Kết quả tổng hợp

16
Tổng case
10
✅ Pass
6
❌ Fail
0
⏳ Pending

§3a đã chạy (node scripts/test-rate-limit.mjs, 2026-06-26): 11 PASS · 1 FAIL/12 assertion — cơ chế chặn của 6 scope + đếm-riêng-id + reset-cửa-sổ + env-override + fail-open đều đúng; chỉ default value lệch spec.

Chi tiết test case

Kết luận & khuyến nghị

  1. §3a (rate-limit) — ĐÃ TEST, ĐẠT về cơ chế: chạy test-rate-limit.mjs10 Pass (chặn đúng limit ở 6 scope, đếm-riêng-id, reset-cửa-sổ, env-override, fail-open) + 1 Fail (default 6/6 scope lệch spec). Đặt env RL_* đúng theo trang, hoặc sửa RL_DEFAULTS. Xác nhận ngưỡng deployed thật cần mật khẩu preview.
  2. §3b (trần 40 voucher/IP/giờ + ISSUE_LIMIT): chưa có trong repo. Cần thêm scope issue-ip (đếm voucher cấp mới) + status ISSUE_LIMIT.
  3. §4 (blocklist IP/CIDR, BLOCKED 403): chưa có trong repo. Cần bảng blocked_ips, check IP/CIDR trong worker (403), cache 60s, lưu source_ip_plain + cờ ADMIN_SHOW_PII.

→ Nếu deployed worker mới hơn repo: cung cấp URL + xác nhận để chạy test động thật (sẽ tạo request/claim thật). Nếu repo là nguồn thật: §3b & §4 là gap cần dev implement trước go-live.