เพื่อป้องกันไม่ให้บอทสแปม (Bot Spam) เข้ามายิงสร้างข้อมูล (Insert) เป็นพันๆ หมื่นๆ แถวในเวลาสั้นๆ ซึ่งจะทำให้ Database เต็ม เซิร์ฟเวอร์ทำงานหนัก และเว็บช้าลง เราจึงได้สร้างระบบสกัดกั้นอัตโนมัติขึ้นมา
ทุกครั้งที่แอปหลัก (พอร์ต 51888) พยายามจะ บันทึกหมวดหมู่ (Categories), บันทึกงาน (Tasks) หรือ สมัครสมาชิกใหม่ (Register) ลงฐานข้อมูล ระบบ API (ไฟล์ todolist/api.php) จะต้องเรียกใช้ฟังก์ชันเช็คลิมิต (checkRateLimit หรือ checkIPRateLimit) ก่อนการประมวลผลเสมอ
เกณฑ์การจำกัดความเร็วแบ่งเป็นดังนี้:
checkIPRateLimit) สามารถสมัครสมาชิกได้สูงสุด 5 บัญชีต่อ 10 นาทีต่อ IPcheckRateLimit) สร้างได้สูงสุด 5 หมวดหมู่ ภายใน 1 นาทีcheckRateLimit) สร้างได้สูงสุด 30 งาน ภายใน 1 นาทีหากบอทพยายามส่งข้อมูลเกินโควตา ระบบจะไม่บันทึกข้อมูลและจะตีกลับสถานะตอบสนองเป็น 429 ทันที:
429 Too Many Requests{"error": "Too many registrations from this IP. Please try again in a few minutes."} (สำหรับหน้าสมัครสมาชิก){"error": "Rate limit exceeded. Please wait a moment."} (สำหรับข้อมูลงาน/หมวดหมู่)
ผู้โจมตีหรือบอทจะไม่สามารถเขียนข้อมูลลงฐานข้อมูลได้อีก และต้องรอ (Delay) จนกว่าจะพ้นรอบเวลาที่กำหนดไว้
// 1. ระบบเช็ค Limit รายบัญชีผู้ใช้
function checkRateLimit($db, $user_id, $table, $limit, $minutes = 1) {
$stmt = $db->prepare("SELECT COUNT(*) FROM $table WHERE user_id = ? AND created_at > (NOW() - INTERVAL ? MINUTE)");
$stmt->execute([$user_id, $minutes]);
if ($stmt->fetchColumn() >= $limit) {
jsonResponse(['error' => 'Rate limit exceeded. Please wait a moment.'], 429);
}
}
// 2. ระบบเช็ค Limit ราย IP ของหน้าลงทะเบียนผู้ใช้ใหม่
function checkIPRateLimit($db, $ip, $table, $limit, $minutes = 1) {
$stmt = $db->prepare("SELECT COUNT(*) FROM $table WHERE ip_address = ? AND created_at > (NOW() - INTERVAL ? MINUTE)");
$stmt->execute([$ip, $minutes]);
if ($stmt->fetchColumn() >= $limit) {
jsonResponse(['error' => 'Too many registrations from this IP. Please try again in a few minutes.'], 429);
}
}
ระบบนี้ไม่ใช้ทรัพยากรเยอะ (นับจากฐานข้อมูลโดยตรง) แต่ให้ผลลัพธ์ในการตัดวงจรบอทได้อย่างชะงัด!