⚠️ 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.
| Rule | Spec trên trang | Trong code repo | Verdict |
|---|---|---|---|
| §3a — cơ chế rate-limit 6 scope | có (env RL_*) | CÓ (rate-limit.ts) | ✅ Có |
| §3a — giá trị default | score-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 403 | có | KHÔNG (không route nào trả 403) | ❌ Chưa làm |
§4/§5 — lưu source_ip_plain + ADMIN_SHOW_PII | có | chỉ 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ị
- §3a (rate-limit) — ĐÃ TEST, ĐẠT về cơ chế: chạy
test-rate-limit.mjs→ 10 Pass (chặn đúnglimitở 6 scope, đếm-riêng-id, reset-cửa-sổ, env-override, fail-open) + 1 Fail (default 6/6 scope lệch spec). Đặt envRL_*đúng theo trang, hoặc sửaRL_DEFAULTS. Xác nhận ngưỡng deployed thật cần mật khẩu preview. - §3b (trần 40 voucher/IP/giờ +
ISSUE_LIMIT): chưa có trong repo. Cần thêm scopeissue-ip(đếm voucher cấp mới) + statusISSUE_LIMIT. - §4 (blocklist IP/CIDR,
BLOCKED 403): chưa có trong repo. Cần bảngblocked_ips, check IP/CIDR trong worker (403), cache 60s, lưusource_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.