⬅️ กลับไปหน้า Dashboard

⏱️ ระบบจำกัดการส่งข้อมูล (Rate Limit & Delay Insert)

🛡️ วัตถุประสงค์

เพื่อป้องกันไม่ให้บอทสแปม (Bot Spam) เข้ามายิงสร้างข้อมูล (Insert) เป็นพันๆ หมื่นๆ แถวในเวลาสั้นๆ ซึ่งจะทำให้ Database เต็ม เซิร์ฟเวอร์ทำงานหนัก และเว็บช้าลง เราจึงได้สร้างระบบสกัดกั้นอัตโนมัติขึ้นมา

1. หลักการทำงาน (How it works)

ทุกครั้งที่แอปหลัก (พอร์ต 51888) พยายามจะ บันทึกหมวดหมู่ (Categories), บันทึกงาน (Tasks) หรือ สมัครสมาชิกใหม่ (Register) ลงฐานข้อมูล ระบบ API (ไฟล์ todolist/api.php) จะต้องเรียกใช้ฟังก์ชันเช็คลิมิต (checkRateLimit หรือ checkIPRateLimit) ก่อนการประมวลผลเสมอ

เกณฑ์การจำกัดความเร็วแบ่งเป็นดังนี้:

2. สิ่งที่เกิดขึ้นเมื่อทะลุขีดจำกัด (Delay / Block)

หากบอทพยายามส่งข้อมูลเกินโควตา ระบบจะไม่บันทึกข้อมูลและจะตีกลับสถานะตอบสนองเป็น 429 ทันที:

HTTP Status: 429 Too Many Requests
ข้อความ (JSON): {"error": "Too many registrations from this IP. Please try again in a few minutes."} (สำหรับหน้าสมัครสมาชิก)
ข้อความ (JSON): {"error": "Rate limit exceeded. Please wait a moment."} (สำหรับข้อมูลงาน/หมวดหมู่)

ผู้โจมตีหรือบอทจะไม่สามารถเขียนข้อมูลลงฐานข้อมูลได้อีก และต้องรอ (Delay) จนกว่าจะพ้นรอบเวลาที่กำหนดไว้

3. หน้าตาของ Code ที่ดูแลระบบนี้

// 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);
    }
}

ระบบนี้ไม่ใช้ทรัพยากรเยอะ (นับจากฐานข้อมูลโดยตรง) แต่ให้ผลลัพธ์ในการตัดวงจรบอทได้อย่างชะงัด!