วาง Security พื้นฐานใน Express ด้วยแนวคิดลดพื้นที่เสี่ยงหลายชั้น
การทำ Express ให้ปลอดภัยไม่ใช่แค่เปิด route ให้ใช้งานได้ แต่ต้องวางมาตรการพื้นฐานตั้งแต่ต้น เช่น helmet, rate limit, validation, sanitization และการจำกัดขนาด request เพื่อค่อย ๆ ลดพื้นที่เสี่ยงในหลายชั้น

วาง Security พื้นฐานใน Express ด้วยแนวคิดลดพื้นที่เสี่ยงหลายชั้น
Express app ที่เปิดใช้งานบนอินเทอร์เน็ตไม่ควรมีเพียงแค่ route ที่ทำงานได้เท่านั้น แต่ควรมี guardrail พื้นฐานตั้งแต่วันแรกที่เริ่มพัฒนา เพราะความปลอดภัยที่ดีไม่ใช่การหวังพึ่งเครื่องมือเพียงตัวเดียว แต่คือการลดพื้นที่เสี่ยงทีละชั้นอย่างเป็นระบบ
เริ่มจาก baseline ที่ดีด้วย helmet
helmet เป็น middleware ยอดนิยมในโลกของ Express ที่ช่วยตั้งค่า HTTP security headers หลายรายการให้อัตโนมัติ เช่น การปิดเผยข้อมูลบาง header ที่ไม่จำเป็น และเพิ่ม policy ที่ช่วยให้แอปปลอดภัยขึ้น
app.use(helmet())
แม้คำสั่งนี้จะสั้นและใช้งานง่าย แต่ไม่ควรเข้าใจว่าเป็นเวทมนตร์ที่ป้องกันทุกภัยคุกคามได้ทันที สิ่งที่ helmet มอบให้คือ baseline ที่ดีมากสำหรับเริ่มต้น และควรถือเป็นหนึ่งในชั้นป้องกันพื้นฐานของทุก Express app
ใช้ rate limit เพื่อกันการยิง request ถี่เกินไป
อีกจุดสำคัญคือการใส่ rate limit ให้กับ endpoint ที่มีความเสี่ยงหรือมีต้นทุนสูง เช่น
- login
- OTP
- reset password
- endpoint ที่เรียกใช้ resource หนัก
ถ้าไม่มีการจำกัดความถี่ คนเพียงคนเดียวหรือ bot เพียงตัวเดียวก็อาจยิง API ซ้ำ ๆ จน database หรือ service หลังบ้านทำงานหนักเกินจำเป็นได้ การมี rate limit จึงช่วยทั้งเรื่องความปลอดภัยและเสถียรภาพของระบบ
Validation และ sanitization ต้องทำงานคู่กัน
หลายระบบมักตรวจสอบแค่รูปแบบข้อมูล แต่ละเลยการทำความสะอาดข้อมูลที่รับเข้ามา ทั้งที่จริงแล้วสองอย่างนี้มีหน้าที่ต่างกัน
- Validation: ตรวจว่าข้อมูลถูกต้องตามเงื่อนไขหรือไม่
- Sanitization: ลด payload แปลก ๆ หรือข้อมูลอันตรายที่อาจนำไปสู่ XSS หรือ injection
แนวคิดสำคัญคือควรทำทั้งสองอย่างร่วมกัน ไม่ใช่เลือกอย่างใดอย่างหนึ่ง เพราะข้อมูลที่ “รูปแบบถูกต้อง” ไม่ได้แปลว่า “ปลอดภัย” เสมอไป
อย่างไรก็ตาม การ sanitize ไม่ใช่ข้ออ้างให้ประกอบ SQL string ด้วยตัวเอง การ query database ควรใช้ parameterized query หรือ ORM ที่จัดการเรื่องนี้อย่างถูกต้อง เพื่อปิดช่องโหว่จาก SQL injection ให้มากที่สุด
ตั้งค่า CORS ให้แคบเท่าที่จำเป็น
CORS เป็นอีกจุดที่มักถูกตั้งค่าแบบกว้างเกินไปเพื่อความสะดวกในการพัฒนา แต่ในระบบจริงควรเปิดเฉพาะ origin ที่จำเป็นต้องใช้งานจริงเท่านั้น
สิ่งสำคัญคืออย่าเข้าใจผิดว่า CORS คือระบบป้องกัน API ทั้งหมด เพราะ CORS มีหน้าที่หลักเกี่ยวกับการควบคุมการเรียกข้าม origin จาก browser ไม่ได้แทน authentication, authorization หรือการป้องกันเชิงลึกอื่น ๆ
จำกัดขนาด body เพื่อลดการใช้ทรัพยากรเกินจำเป็น
การปล่อยให้ client ส่ง request body ขนาดใหญ่ได้โดยไม่มีข้อจำกัด อาจทำให้ระบบใช้ memory มากเกินความจำเป็น และเปิดโอกาสให้เกิดปัญหาด้านประสิทธิภาพหรือการโจมตีบางรูปแบบได้
ตัวอย่างเช่น
app.use(express.json({ limit: "1mb" }))
การกำหนด limit ที่เหมาะสมช่วยลดความเสี่ยงจาก request ขนาดใหญ่ และทำให้ระบบควบคุมทรัพยากรได้ดีขึ้น
Security ที่ดีคือหลายชั้นทำงานร่วมกัน
ความปลอดภัยใน Express ไม่ได้เกิดจาก middleware ตัวเดียว แต่เกิดจากการประกอบหลายองค์ประกอบเข้าด้วยกัน เช่น
- helmet
- rate limit
- validation
- sanitization
- auth
- logging
- error handling
ไม่มีเครื่องมือตัวไหนแทนทุกอย่างได้ทั้งหมด แต่เมื่อวางเป็นหลายชั้นร่วมกัน จะช่วยลดความเสี่ยงได้มาก และทำให้ระบบพร้อมรับมือกับปัญหาได้ดีกว่าการแก้แบบเฉพาะจุด
สรุป
Security พื้นฐานใน Express ควรถูกออกแบบตั้งแต่เริ่ม ไม่ใช่รอให้ระบบเปิดใช้งานไปแล้วค่อยกลับมาอุดช่องโหว่ การเริ่มจาก baseline ที่ดีด้วย helmet เสริมด้วย rate limit, validation, sanitization, การตั้งค่า CORS อย่างเหมาะสม และการจำกัดขนาด body คือแนวทางง่าย ๆ ที่ช่วยลดพื้นที่เสี่ยงได้อย่างมีนัยสำคัญ เมื่อทุกชั้นทำงานร่วมกัน ระบบก็จะปลอดภัยและเสถียรมากขึ้นในระยะยาว