Thiết kế rate limit cho API đăng nhập PHP để chống thử mật khẩu hàng loạt

Đang tìm đáp án

17 lượt xem · 2 trả lời

Cộng đồng đang cùng tìm lời giải

Người đặt câu hỏi có thể chọn câu trả lời hữu ích nhất làm đáp án.

1. 12:27 06/08/2026
Chào admin, API đăng nhập của mình đang dùng PHP và MySQL. Mình muốn hạn chế brute force nhưng không muốn khóa nhầm người dùng thật khi họ đổi mạng hoặc nhập sai vài lần. Nên giới hạn theo IP, theo tài khoản hay kết hợp cả hai? Khi vượt ngưỡng thì API cần trả về thế nào?
0 Facebook
2. 12:27 06/08/2026
Chào bạn Quốc, Nên kết hợp nhiều tín hiệu: giới hạn theo IP để giảm lưu lượng tự động, theo định danh tài khoản để bảo vệ mục tiêu cụ thể, và áp dụng ngưỡng hoặc thời gian chờ khác nhau cho từng lớp. Không nên chỉ khóa dài hạn theo IP vì NAT hoặc mạng di động có thể làm ảnh hưởng người dùng khác. Bạn có thể lưu các lần thử trong Redis hoặc MySQL tùy lưu lượng, dùng cửa sổ thời gian hoặc thuật toán token bucket. Khi bị giới hạn, trả mã 429 và Retry-After phù hợp, nhưng thông điệp đăng nhập thất bại vẫn phải chung chung để không tiết lộ tài khoản tồn tại. Luôn ghi log, cảnh báo các mẫu bất thường và bổ sung MFA hoặc CAPTCHA theo mức rủi ro, thay vì xem rate limit là lớp phòng thủ duy nhất.
0
3. 16:47 13/10/2026
Trả lời Quốc Bùi Chào admin, API đăng nhập của mình đang dùng PHP và MySQL. Mình muốn hạn chế brute force nhưng không muốn khóa nhầm ngườ…
Kết hợp cả IP và tài khoản là an toàn nhất. Với IP, dùng sliding window (ví dụ 5 lần/phút) để chặn bot quét dải, lưu vào Redis với key `ratelimit:login:ip:{ip}` TTL 60s. Với tài khoản, dùng fixed window chặt hơn (5 lần/15 phút) key `ratelimit:login:user:{id}` TTL 900s, tránh khóa nhầm khi người thật đổi 4G/WiFi. Vượt ngưỡng trả **429 Too Many Requests**, header `Retry-After` tính giây còn lại, body JSON `{ "error": "rate_limited", "retry_after": 45 }` – client hiển thị đếm ngược thay vì báo "sai mật khẩu" để không lộ thông tin. Đừng quên whitelist IP nội bộ/monitoring và log đầy đủ `ip, user_id, ua, result` để audit sau. Nếu dùng Cloudflare/Load Balancer, nhớ đọc header `CF-Connecting-IP` hoặc `X-Forwarded-For` (chỉ lấy IP đầu tiên tin cậy) để không bị bypass. Bạn đang định xử lý trường hợp một tài khoản bị tấn công từ hàng trăm IP khác nhau (credential stuffing) như thế nào?
0
Vui lòng đăng nhập để tham gia trả lời chủ đề này.
Điều hướng nhanh

Bạn muốn khám phá điều gì?

Tìm chủ đề, bài viết hoặc đi thẳng đến một khu vực của cộng đồng.

Esc để đóng Ctrl K để mở lại