Rate Limit สำหรับป้องกัน Spam ปุ่ม Submit
Published on April 30, 2026
2 min read
Rate Limit คือการจำกัดจำนวนครั้งที่ผู้ใช้สามารถทำ Action ซ้ำได้ในช่วงเวลาหนึ่ง ซึ่งช่วยป้องกันปัญหาการกดปุ่มซ้ำหลายครั้ง ลดภาระ Server และป้องกัน bot หรือพฤติกรรมที่ผิดปกติในระบบ E-commerce
ระดับของ Rate Limit
Basic Protection (พื้นฐาน)
เหมาะสำหรับ App ที่เพิ่งเริ่มต้น หรือยังไม่มีปัญหา spam ที่รุนแรง
const rateLimits = {
perMinute: 3, // 3 ครั้ง/นาที
perHour: 10, // 10 ครั้ง/ชั่วโมง
cooldown: 20000 // ห่าง 20 วินาที/ครั้ง
}
Medium Protection (กลาง - แนะนำ)
เหมาะสำหรับ E-commerce ทั่วไป สมดุลระหว่างความปลอดภัยและ UX
const rateLimits = {
perMinute: 2, // 2 ครั้ง/นาที
perHour: 5, // 5 ครั้ง/ชั่วโมง
perDay: 20, // 20 ครั้ง/วัน
cooldown: 30000 // ห่าง 30 วินาที/ครั้ง
}
Strict Protection (เข้มงวด)
เหมาะสำหรับระบบที่มีความเสี่ยงสูง หรือต้องการการควบคุมที่แน่นหนา
const rateLimits = {
perMinute: 1, // 1 ครั้ง/นาที
perHour: 3, // 3 ครั้ง/ชั่วโมง
perDay: 10, // 10 ครั้ง/วัน
cooldown: 60000 // ห่าง 1 นาที/ครั้ง
}
แนะนำสำหรับ E-commerce ทั่วไป
ควรแยก Rate Limit ออกเป็น 2 ชั้น คือ Client-side เพื่อ UX และ Server-side เพื่อความปลอดภัยจริง
// Client-side (UI disable)
const clientLimit = {
cooldown: 3000 // disable ปุ่ม 3 วินาที
}
// Server-side (ป้องกันจริง)
const serverLimit = {
perMinute: 2, // 2 ออเดอร์/นาที
perHour: 5, // 5 ออเดอร์/ชั่วโมง
perDay: 20 // 20 ออเดอร์/วัน (ผู้ใช้ทั่วไป)
}
ปรับตาม User Type
ผู้ใช้แต่ละประเภทมีความน่าเชื่อถือและ Pattern การใช้งานต่างกัน ควรตั้งค่า limit ให้สอดคล้องกัน
const rateLimitByUserType = {
guest: {
perHour: 2,
perDay: 5
},
registered: {
perHour: 5,
perDay: 20
},
verified: {
perHour: 10,
perDay: 50
},
vip: {
perHour: 20,
perDay: 100
}
}
การป้องกันเพิ่มเติม
นอกจาก Rate Limit ยังมีวิธีเสริมที่ควรนำมาใช้ร่วมกัน
- Debounce ปุ่ม - ห่าง 3-5 วินาทีหลังกดแต่ละครั้ง
- CAPTCHA - แสดงเมื่อกดเกิน 3 ครั้งภายใน 5 นาที
- IP-based limit - ป้องกัน bot ที่ใช้ user คนเดียวยิง request
- Session tracking - ตรวจสอบพฤติกรรมผิดปกติ เช่น กดเร็วผิดมนุษย์
- Payment verification - ยืนยันการชำระเงินก่อนสร้าง Order จริง
ตัวอย่าง Implementation
ตัวอย่าง Rate Limiter แบบ Simple ที่ใช้ Map เก็บ attempt ของแต่ละ user
const orderAttempts = new Map();
async function createOrder(userId) {
const now = Date.now();
const userAttempts = orderAttempts.get(userId) || [];
// ลบ attempts เก่าที่เกิน 1 ชั่วโมง
const recentAttempts = userAttempts.filter(
time => now - time < 3600000
);
if (recentAttempts.length >= 5) {
throw new Error('คุณสั่งซื้อถี่เกินไป กรุณารอสักครู่');
}
recentAttempts.push(now);
orderAttempts.set(userId, recentAttempts);
// ดำเนินการสั่งซื้อ
return processOrder();
}
คำแนะนำเพิ่มเติม
- เริ่มต้นปานกลาง แล้วปรับตามข้อมูลการใช้งานจริง อย่า over-restrict ตั้งแต่แรก
- เก็บ logs ทุก attempt เพื่อวิเคราะห์พฤติกรรมและปรับ threshold ได้แม่นขึ้น
- แจ้งเตือนให้ชัดเจน เมื่อ user โดน rate limit เช่น บอกว่าต้องรออีกกี่วินาที
- ยืดหยุ่นในช่วง peak เช่น flash sale หรือ 11.11 อาจปรับ limit ชั่วคราวได้
สำหรับ ธุรกิจทั่วไป แนะนำที่ 2 ครั้ง/นาที และ 5 ครั้ง/ชั่วโมง ซึ่งสมดุลระหว่างการป้องกัน spam และไม่กวนใจผู้ใช้งานจริง
ตั้ม — ศิริชัย ธีรภัทรสกุล
นักพัฒนาเว็บฟรีแลนซ์ตั้งแต่ปี 2547 รับพัฒนาเว็บไซต์ ระบบจัดการธุรกิจ และงาน Outsource / Sub-contract (WFH 100%)