PlusMagi's Blog By Pitt Phunsanit

RESTful: update data

การอนุญาตให้ User ส่งข้อมูลมาแก้ไข หรือสร้างใหม่ ในระบบ RESTful API เป็นจุดที่อันตรายที่สุดหากไม่มีการควบคุมที่ดีครับ เพราะ Hacker อาจส่ง Field ที่เราไม่ได้อนุญาต เข้ามาใน Request Body เพื่อแอบแก้ไขข้อมูลสำคัญได้

นี่คือสิ่งที่ต้องระวังและจัดการเพื่อให้ API ของคุณปลอดภัยครับ


การควบคุมฟิลด์ที่อนุญาต

นี่คือเรื่องที่สำคัญที่สุด หรือที่เรียกว่า “Allowlist” คือเราต้องระบุให้ชัดเจนว่า Column ไหนบ้างที่อนุญาตให้แก้ไขได้


การทำ Data Validation & Sanitization

อย่าเชื่อใจข้อมูลที่มาจาก Client แม้แต่ตัวอักษรเดีย


การตรวจสอบสิทธิ์

ไม่ใช่แค่ Login ผ่าน (Authentication) แล้วจะแก้ได้ทุกอย่าง ต้องเช็คด้วยว่า “เขามีสิทธิ์แก้ Record นี้ไหม”


ความแตกต่างระหว่าง PUT และ PATCH

การใช้ Method ให้ถูกช่วยลดโอกาสข้อมูลพัง ได้


การใช้ DTO

ในระบบขนาดใหญ่ เราจะไม่ส่ง Request Object ตรง ๆ เข้าไปที่ฐานข้อมูล แต่จะใช้ DTO เป็นตัวคั่น

  1. รับ Request เข้ามา
  2. Map เฉพาะข้อมูลที่ต้องการใส่ใน DTO
  3. ส่ง DTO ไปจัดการต่อใน Service/Database

🛠 ตัวอย่างการจัดการในทางปฏิบัติ

// ตัวอย่างแบบอันตราย (Don't do this) // รับมาทุกอย่างแล้วบันทึกเลย -> Hacker สามารถส่ง { "role": "admin" } มาได้
User.update (req.body) ; // ตัวอย่างแบบปลอดภัย (Allowed Columns) const allowedFields = ['first_name', 'last_name', 'bio'];
const updateData = {}; allowedFields.forEach (field => { if (req.body[field] !== undefined) { updateData[field] = req.body[field]; }
}) ; // ตรวจสอบสิทธิ์ก่อนบันทึก
if (user.id === req.user.id || req.user.isAdmin) { User.update (updateData) ;
}

⚠️ ข้อควรระวังเพิ่มเติม

เมื่อคุณจัดการเรื่อง Security ในระดับ Code แล้ว อย่าลืมระดับ Infrastructure ด้วย


อ่านเพิ่มเติม

Exit mobile version