ป้ายกำกับ: Signature

Input Validation & Sanitization (ป้องกัน SQLi, XSS, Command Injection)Input Validation & Sanitization (ป้องกัน SQLi, XSS, Command Injection)

ในโลกของการพัฒนาแอปพลิเคชันที่ต้องมีการโต้ตอบกับผู้ใช้งาน (User Input) อย่างต่อเนื่อง ข้อมูลที่เข้ามาจากแหล่งภายนอกถือเป็นจุดเสี่ยงที่สำคัญที่สุด หากเราเชื่อถือข้อมูลเหล่านี้โดยไม่มีการตรวจสอบอย่างเข้มงวด ระบบของเราจะตกอยู่ในความเสี่ยงของช่องโหว่ร้ายแรง เช่น SQL Injection (SQLi), Cross-Site Scripting (XSS) และ Command Injection


หลักการพื้นฐาน: Validation vs. Sanitization

การป้องกันช่องโหว่เหล่านี้ต้องอาศัยความเข้าใจที่แตกต่างระหว่างสองแนวคิดหลัก:

  1. Validation (การตรวจสอบความถูกต้อง): คือการตรวจสอบว่าข้อมูลที่รับเข้ามามีรูปแบบ (Format) และประเภท (Type) ตรงตามที่ระบบกำหนดหรือไม่ เช่น หากช่องรหัสสินค้าต้องเป็นตัวเลขเท่านั้น เราต้องใช้ Type Casting หรือ Regular Expressions (Regex) เพื่อบังคับให้เป็นตัวเลข
  2. Sanitization (การทำความสะอาด): คือการกำจัดหรือแก้ไขส่วนประกอบที่เป็นอันตรายออกจากข้อมูลนั้นๆ โดยเฉพาะอย่างยิ่งเมื่อเราอนุญาตให้ผู้ใช้ป้อนข้อมูลที่มีโครงสร้าง เช่น HTML หรือ XML เราต้องใช้ฟังก์ชันการทำความสะอาดเพื่อลบแท็กที่เป็นอันตรายออกไป

การป้องกัน SQL Injection (SQLi) ใน PostgreSQL

SQLi คือการที่ผู้โจมตีแทรกคำสั่ง SQL เข้าไปในช่องข้อมูลปกติเพื่อขโมยหรือแก้ไขข้อมูล การป้องกันที่ได้มาตรฐานที่สุดคือการใช้ Parameterized Queries (Prepared Statements) ซึ่งจะแยกคำสั่ง SQL ออกจากข้อมูลที่ผู้ใช้ป้อนโดยสิ้นเชิง ทำให้ข้อมูลที่ป้อนเข้ามาถูกมองว่าเป็นเพียงค่า (Value) ไม่ใช่ส่วนหนึ่งของคำสั่ง (Command)

ตัวอย่างการป้องกัน SQLi ด้วย Prepared Statements ใน PostgreSQL:

SQL

-- ❌ แนวทางที่ไม่ปลอดภัย (String Concatenation) --<br>SELECT * FROM users WHERE username = 'user_input'; -- ถ้า user_input คือ ' OR 1=1 --' จะเกิดช่องโหว่<br><br>-- ✅ แนวทางที่ปลอดภัย (Parameterized Query) --<br>SELECT * FROM users WHERE username = $1;<br>-- PostgreSQL จะจัดการให้ $1 เป็นค่าข้อมูลเสมอ ไม่ใช่โค้ด SQL

การป้องกัน XSS และ Command Injection

Cross-Site Scripting (XSS): แม้ว่า XSS จะเป็นปัญหาที่เกิดขึ้นในระดับ Application Layer (Frontend/Backend Language) ไม่ใช่ระดับ SQL โดยตรง แต่หลักการป้องกันคือการ Escaping ข้อมูลทุกครั้งก่อนที่จะแสดงผล (Output Encoding) เพื่อให้เบราว์เซอร์มองว่าข้อมูลนั้นเป็นแค่ข้อความธรรมดา ไม่ใช่โค้ด JavaScript

Command Injection: ปัญหานี้จะเกิดขึ้นเมื่อแอปพลิเคชันรันคำสั่งระบบปฏิบัติการ (OS Command) โดยใช้ข้อมูลจากผู้ใช้โดยตรง ใน PostgreSQL ควรหลีกเลี่ยงการเรียกใช้คำสั่งภายนอก (เช่น `COPY FROM PROGRAM`) หากจำเป็นต้องทำ ต้องมีการตรวจสอบและจำกัดขอบเขตของ input อย่างเข้มงวดที่สุด

บทสรุป: แนวคิด Defense in Depth

การป้องกันช่องโหว่ทางความปลอดภัยไม่ใช่การใช้เทคนิคใดเทคนิคหนึ่ง แต่ต้องใช้แนวคิดแบบ Defense in Depth กล่าวคือ เราต้องรวมหลายชั้นของการตรวจสอบเข้าด้วยกัน:

  • Layer 1 (Validation): ตรวจสอบรูปแบบข้อมูลที่ระดับแอปพลิเคชัน (เช่น ต้องเป็นตัวเลข, ต้องมีความยาว 5-10 ตัวอักษร)
  • Layer 2 (Prepared Statements): ใช้ Prepared Statements เสมอเมื่อมีการโต้ตอบกับฐานข้อมูล PostgreSQL
  • Layer 3 (Sanitization/Escaping): ทำความสะอาดข้อมูลก่อนจัดเก็บ (Sanitize) และเข้ารหัสข้อมูลก่อนแสดงผล (Escape)

การปฏิบัติตามหลักการเหล่านี้จะช่วยยกระดับความปลอดภัยของระบบที่พัฒนาบน PostgreSQL ให้แข็งแกร่งและทนทานต่อภัยคุกคามทางไซเบอร์ได้อย่างมีประสิทธิภาพ