Security
น้องๆ หลายคนอาจจะคุ้นเคยกับการเขียน API แต่เคยคิดถึงเรื่องความปลอดภัยกันบ้างไหม? API Security Best Practices คือชุดของแนวทางและเทคนิคที่เราใช้เพื่อปกป้อง API ของเราจากการโจมตีต่างๆ ไม่ว่าจะเป็นการเจาะข้อมูล, การปลอมแปลงตัวตน หรือการทำให้ระบบล่ม
สมัยผมทำร้านเน็ต SiamCafe ยุคแรกๆ (ตั้งแต่ปี 1997) เรื่อง security นี่สำคัญสุดๆ เพราะถ้าโดนแฮก ลูกค้าก็เล่นเกมไม่ได้ ข้อมูลก็หายหมด API Security ก็เหมือนกัน ถ้าไม่ดูแลให้ดี ข้อมูลลูกค้า, ธุรกรรมทางการเงิน หรือข้อมูลสำคัญอื่นๆ ก็อาจจะหลุดไปอยู่ในมือคนไม่หวังดีได้
คิดง่ายๆ API คือประตูบ้าน ถ้าเราไม่ใส่กลอน ไม่ติดลูกกรง ใครๆ ก็เข้ามาขโมยของได้ API Security ก็เหมือนกลอนและลูกกรงที่ช่วยป้องกันบ้านของเรานั่นเอง
Authentication คือการยืนยันว่าคนที่เข้ามาใช้ API เป็นใครกันแน่ สมัยก่อนเวลาเข้าร้านเน็ต ผมต้องจำ username/password ของลูกค้าทุกคน (เพราะยังไม่มีระบบสมาชิกแบบทุกวันนี้) API ก็เหมือนกัน ต้องมีระบบให้ผู้ใช้ยืนยันตัวตนก่อนใช้งาน
วิธีที่นิยมใช้กันก็คือ:
// ตัวอย่างการใช้ API Key
if (apiKey == "YOUR_API_KEY") {
// อนุญาตให้เข้าถึง API
} else {
// ปฏิเสธการเข้าถึง
}
Authorization คือการตรวจสอบว่าคนที่ยืนยันตัวตนแล้ว มีสิทธิ์ทำอะไรได้บ้าง สมมติว่าลูกค้าผม login เข้ามาในระบบ แต่ไม่ได้เป็น admin ก็ไม่ควรมีสิทธิ์แก้ไขข้อมูลเครื่องลูกข่าย API ก็เช่นกัน ผู้ใช้แต่ละคนอาจจะมีสิทธิ์ในการเข้าถึงข้อมูลหรือฟังก์ชันที่แตกต่างกัน
เช่น ผู้ใช้ทั่วไปอาจจะดูข้อมูลส่วนตัวได้ แต่ admin ถึงจะสามารถแก้ไขข้อมูลได้
// ตัวอย่างการตรวจสอบสิทธิ์
if (userRole == "admin") {
// อนุญาตให้แก้ไขข้อมูล
} else {
// ไม่อนุญาตให้แก้ไขข้อมูล
// แสดงข้อความแจ้งเตือน
}
HTTPS คือการเข้ารหัสข้อมูลที่ส่งผ่านระหว่าง client กับ server สมัยก่อนตอนที่ยังไม่มี HTTPS เวลาส่ง password ผ่านอินเทอร์เน็ต ใครดักฟังก็เห็นหมด HTTPS จะช่วยป้องกันไม่ให้ข้อมูลถูกดักจับระหว่างทาง
คิดง่ายๆ เหมือนเราส่งจดหมายลับ ถ้าไม่เข้ารหัส ใครเปิดอ่านก็รู้ความลับหมด แต่ถ้าเข้ารหัส ถึงคนอื่นเปิดอ่านก็อ่านไม่ออก
เริ่มต้นใช้งาน API Security Best Practices ไม่ยากอย่างที่คิดครับ ค่อยๆ ทำความเข้าใจทีละขั้นตอน แล้วค่อยๆ ปรับใช้กับ API ของเรา
การตรวจสอบข้อมูลนำเข้าคือการตรวจสอบว่าข้อมูลที่ส่งเข้ามาใน API มีรูปแบบถูกต้อง และปลอดภัย สมัยผมทำร้านเน็ต เคยเจอเคสที่ลูกค้าพิมพ์ชื่อเกมยาวเกินไป ทำให้ระบบรวน API ก็เหมือนกัน ต้องตรวจสอบว่าข้อมูลที่รับมาถูกต้องตามที่เราต้องการ
ป้องกันการโจมตีแบบ Injection เช่น SQL Injection หรือ Cross-Site Scripting (XSS) ได้ด้วย
// ตัวอย่างการตรวจสอบข้อมูลนำเข้า
function validateEmail(email) {
const re = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
return re.test(email);
}
if (!validateEmail(req.body.email)) {
// แสดงข้อผิดพลาด
}
Rate Limiting คือการจำกัดจำนวนครั้งที่ผู้ใช้สามารถเรียก API ได้ในช่วงเวลาที่กำหนด ช่วยป้องกันการโจมตีแบบ Denial of Service (DoS) ที่พยายามทำให้ระบบล่มโดยการส่ง request จำนวนมาก
คิดง่ายๆ เหมือนจำกัดจำนวนคนที่เข้ามาร้านเน็ตในเวลาเดียวกัน ถ้ามีคนเข้ามาเยอะเกินไป ระบบก็จะช้า หรือล่มไปเลย
// ตัวอย่างการใช้ Rate Limiting (ใช้ middleware)
const rateLimit = require("express-rate-limit");
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 นาที
max: 100 // จำกัด 100 request ต่อ 15 นาที
});
app.use(limiter);
การบันทึกและติดตามการใช้งาน API จะช่วยให้เราสามารถตรวจสอบความผิดปกติ และแก้ไขปัญหาได้อย่างรวดเร็ว สมัยก่อนเวลาเครื่องในร้านมีปัญหา ผมจะจดบันทึกอาการ และวิธีแก้ไขไว้ API ก็เหมือนกัน ต้องมีระบบบันทึก log เพื่อดูว่าเกิดอะไรขึ้นบ้าง
เช่น บันทึก IP address, เวลา, และ request ที่เข้ามาใน API
// ตัวอย่างการ logging
app.use((req, res, next) => {
console.log(`[${new Date().toISOString()}] ${req.method} ${req.url}`);
next();
});
ดูวิดีโอเพิ่มเติมเกี่ยวกับApi Security Best Practices:
API Security Best Practices ไม่ใช่ทางเลือกเดียวในการรักษาความปลอดภัย แต่มีทางเลือกอื่นๆ ที่เราสามารถนำมาใช้ร่วมกันได้
| ทางเลือก | ข้อดี | ข้อเสีย |
|---|---|---|
| Web Application Firewall (WAF) | ป้องกันการโจมตีระดับ application layer เช่น SQL Injection, XSS | อาจจะซับซ้อนในการติดตั้งและตั้งค่า |
| API Gateway | ทำหน้าที่เป็นตัวกลางระหว่าง client กับ API ช่วยจัดการ authentication, authorization, rate limiting | อาจจะมีค่าใช้จ่ายเพิ่มเติม |
| Security Audits | ตรวจสอบช่องโหว่ของ API โดยผู้เชี่ยวชาญ | มีค่าใช้จ่าย และต้องทำเป็นประจำ |
สุดท้ายแล้ว การเลือกใช้ API Security Best Practices หรือทางเลือกอื่นๆ ขึ้นอยู่กับความต้องการ และงบประมาณของแต่ละโปรเจกต์ครับ ลองศึกษาข้อมูลเพิ่มเติมได้ที่ SiamCafe Blog นะครับ
อย่าลืมว่า Security เป็นเรื่องที่ต้องใส่ใจตลอดเวลา ไม่ใช่แค่ตอนเริ่มต้นเท่านั้น อัปเดตความรู้ และเครื่องมืออยู่เสมอ แล้ว API ของเราก็จะปลอดภัยจากภัยคุกคามต่างๆ
ถ้าอยากรู้เรื่อง IT ยุค 90s หรือเรื่องราวสมัยร้านเน็ต SiamCafe ลองแวะมาอ่านที่ SiamCafe Blog ได้นะครับ
เอาล่ะน้องๆ มาถึงหัวใจสำคัญแล้ว เรื่อง API Security เนี่ย ไม่ใช่แค่ใส่โค้ดอะไรนิดหน่อยแล้วจบนะ มันคือการคิดถึงภาพรวมทั้งหมด ตั้งแต่เริ่มออกแบบระบบ ไปจนถึงตอนที่ระบบทำงานจริงๆ สมัยผมทำร้านเน็ตนี่ เจอลูกค้าสารพัดรูปแบบ กว่าจะกันพวกเด็กเกรียนมาแฮ็กเกมได้นี่ เล่นเอาเหนื่อย
สิ่งที่สำคัญที่สุดคือ "อย่าไว้ใจอะไรเลย" ไม่ว่าข้อมูลจะมาจากไหน หรือใครเป็นคนส่งมา ต้องตรวจสอบให้หมด อย่าคิดว่า "เฮ้ย อันนี้มาจากระบบเราเอง ปลอดภัยชัวร์" เพราะถ้าโดนแฮ็กเข้าไปแล้ว ระบบภายในก็ไม่ปลอดภัยเหมือนกัน
Authentication คือการยืนยันตัวตน ว่าคนที่เข้ามาใช้งานเป็นใคร Authorization คือการกำหนดสิทธิ์ ว่าแต่ละคนทำอะไรได้บ้าง สองอย่างนี้ต้องไปด้วยกัน อย่าปล่อยให้ใครเข้ามาทำอะไรก็ได้มั่วซั่ว
สมัยก่อนผมเคยเจอเคสที่คนร้ายปลอมเป็น admin แล้วเข้าไปลบข้อมูลลูกค้าในระบบเกม ต้องเสียเวลา Restore ข้อมูลกันวุ่นวาย เพราะตอนนั้นระบบ Authorization เรายังไม่ดีพอ
// ตัวอย่าง (อย่างง่าย) การใช้ JWT สำหรับ Authentication
const jwt = require('jsonwebtoken');
// สร้าง token
const token = jwt.sign({ userId: 123, role: 'user' }, 'secretKey', { expiresIn: '1h' });
// ตรวจสอบ token
jwt.verify(token, 'secretKey', (err, decoded) => {
if (err) {
console.log('Token is invalid');
} else {
console.log('Decoded token:', decoded);
}
});
ข้อมูลที่ส่งเข้ามาใน API ต้องตรวจสอบให้ละเอียด ว่าเป็นไปตามที่เราคาดหวังไหม ทั้งรูปแบบ (Format) ชนิด (Type) และขนาด (Size) อย่าเชื่อใจข้อมูลจาก User เด็ดขาด
เคยเจอเคสที่ User ส่งค่าแปลกๆ เข้ามาในช่อง Username ทำให้ระบบ Error แล้วแฮ็กเกอร์ก็ใช้ช่องโหว่นั้นเข้ามาในระบบได้ Input Validation นี่แหละ ช่วยเราได้
// ตัวอย่างการ Validation ด้วย Joi
const Joi = require('joi');
const schema = Joi.object({
username: Joi.string().alphanum().min(3).max(30).required(),
password: Joi.string().pattern(new RegExp('^[a-zA-Z0-9]{3,30}$')).required(),
});
const validationResult = schema.validate(req.body);
if (validationResult.error) {
// Handle error
console.log(validationResult.error.details);
} else {
// Proceed with valid data
console.log('Data is valid');
}
Rate Limiting คือการจำกัดจำนวนครั้งที่ API ถูกเรียกใช้ ในช่วงเวลาที่กำหนด ช่วยป้องกันการโจมตีแบบ Brute Force หรือ DDoS ได้
สมัยก่อนร้านเน็ตโดน DDoS บ่อยมาก ต้องใช้ Firewall ช่วย Rate Limiting ก็เหมือน Firewall สำหรับ API นั่นแหละ
บันทึกทุกการเข้าถึง API และเฝ้าดูพฤติกรรมที่ผิดปกติ ถ้าเจออะไรแปลกๆ จะได้รู้ตัวทัน
การ Logging ที่ดี ช่วยให้เราตามรอยปัญหาได้ง่ายขึ้น เวลาเกิดเหตุการณ์ไม่คาดฝัน
เพราะ API คือประตูหน้าบ้านของระบบ ถ้า API ไม่ปลอดภัย ข้อมูลทุกอย่างก็ตกอยู่ในความเสี่ยง
OWASP (Open Web Application Security Project) คือองค์กรไม่แสวงผลกำไรที่ให้ความรู้และเครื่องมือเกี่ยวกับ Web Application Security เป็นแหล่งข้อมูลที่ดีมากๆ สำหรับคนที่อยากศึกษาเรื่องนี้
HTTPS ช่วยเข้ารหัสข้อมูลระหว่าง Client กับ Server แต่ไม่ได้ป้องกันการโจมตีอื่นๆ เช่น SQL Injection หรือ Cross-Site Scripting (XSS) ต้องใช้ร่วมกับเทคนิคอื่นๆ ด้วย
มีเยอะแยะเลยน้อง อย่างเช่น Postman, Burp Suite, OWASP ZAP ลองหามาเล่นดู
API Security เป็นเรื่องที่ต้องให้ความสำคัญอย่างยิ่งยวด อย่ามองข้ามเด็ดขาด เพราะถ้าพลาดขึ้นมา ความเสียหายอาจจะมากกว่าที่คิดเยอะ สมัยนี้โลกมันเปลี่ยนไปเยอะ การป้องกันตัวเองจึงสำคัญที่สุด พี่ก็หวังว่าน้องๆ จะได้ประโยชน์จากบทความนี้นะ ลองเอาไปปรับใช้กันดู
หากสนใจเรื่อง Forex ลองดูที่ iCafeForex นะครับ
ติดตามบทความอื่นๆ ได้ที่ SiamCafe Blog ครับ