จากบทความเรื่อง The Basics of Web Application Security
ได้ทำการอธิบายเกี่ยวกับการพัฒนา web application อย่างไรให้มีความปลอดภัย
โดยเน้นไปที่พื้นฐานของการพัฒนา
ซึ่งมีความน่าสนใจและสำคัญอย่างมาก
สำหรับ developer หน้าใหม่และประสบการณ์ยังไม่เยอะ
ดังนั้น จึงทำการแปลและสรุปส่วนที่น่าสนใจไว้นิดหน่อย
มาเริ่มกันเลย
ในการพัฒนา web application นั้น มีสิ่งที่ท้าทายเยอะมาก
ความท้าทายในอันดับต้น ๆ ก็คือ เรื่องความปลอดภัย (Security) แต่บ่อยครั้งที่มักถูกหลงลืม หรือ ปล่อยปละละเลยไป !! เรื่องของการพัฒนา web application ให้มีความปลอดภัยนั้น มีเทคนิค หรือ วิธีการมากมายทั้งยากและง่าย แต่ก่อนอื่น Developer ควรเรียนรู้และทำความเข้าใจกับพื้นฐานก่อน เช่น เรื่องการตรวจสอบ input เป็นต้น Developer บางคนอาจจะบอกว่า แค่พัฒนาระบบให้เสร็จตามความต้องการของลูกค้าก็ยากอยู่แล้ว ให้ระบบทำงานรวดเร็วก็ยากขึ้นไปอีก ไหนจะต้องเขียน code ให้ดีอีก ไหนจะต้องเขียน code ให้รองรับการขยายอีก ไหนจะต้อง .... ไหนจะต้องเรื่องความน่าเชื่อถือ ไหนจะต้องเรื่องความเสถียร … มันเยอะไปหมดเลย ส่วนเรื่องของความปลอดภัยมันมักจะอยู่ท้าย ๆ ของ requirment มักถูกละเลย ไม่สนใจ แต่เมื่อใดก็ตามระบบงานมันทำงานผิดพลาด หรือไม่เป็นไปทำที่เราต้องการ เมื่อนั้นแหละ เรื่องความปลอดภัยมันจะสำคัญอย่างมาก ถ้าไม่โดนกับตัวเอง จะไม่รู้สึก และ เข้าใจ !!ก่อนอื่นต้องเข้าใจก่อนว่า
เรื่องของความปลอดภัยคือ เรื่องของความไว้ใจล้วน ๆ ลองถามตัวเองสิว่า- คุณไว้ใจข้อมูลที่ส่งมาจากผู้ใช้งานว่าถูกต้องเสมอหรือไม่ ?
- คุณไว้ใจว่าการเชื่อมต่อระหว่างระบบกับผู้ใช้งานจะไม่ถูกดักฟัง หรือ ขโมย ?
- คุณไว้ใจระบบของคุณว่าข้อมูลต่าง ๆ มันถูกต้อง และ ปลอดภัยหรือไม่ ?
สิ่งแรกที่ Developer ทุกคนควรทำก็คือ การจัดการกับข้อมูลเข้า (Input)
ต้องทำการปฏิเสธข้อมูลที่ไม่เป็นไปตามที่ระบบต้องการ หรือ คาดหวังเสมอ Developer บางคนบอกว่า เราทำการตรวจสอบข้อมูลต่าง ๆ จากผู้ใช้งานด้วย JavaScript นะ แต่ในมุมมองของความปลอดภัยแล้ว บอกได้เลยว่า มันไม่มีประโยชน์อะไรเลย เพราะว่า ผู้ใช้งานเพียงปิด JavaScript หรือ ทำการจำลอง request การส่งข้อมูลมายัง server เพียงเท่านี้ JavaScript ก็หมดความหมายไปในทันที ให้เริ่มด้วยการอย่าไว้ใจข้อมูลเข้า (Input) ใด ๆ ทั้งสิ้น HTTPS ก็ช่วยอะไรไม่ได้นะครับ มันคนละเรื่อง ดังนั้น ฝั่ง server ต้องทำการตรวจสอบข้อมูลเข้าเสมอ ลองถามตัวเราเองสิว่า วันนี้ทำการตรวจสอบข้อมูลเข้ากันหรือยัง เช่น- ชนิดของข้อมูลมันตรงตามที่ต้องการหรือไม่ ?
- รูปแบบข้อมูลตรงตามที่ต้องการหรือไม่ ?
- ข้อมูลมันส่งผลกระทบต่อการประมวลผลของระบบหรือไม่ ?
- ข้อมูลมีขนาดใหญ่เกินที่ต้องการหรือไม่ ?
Input Validation คืออะไรกัน ?
เป็นกระบวนการเพื่อทำให้มั่นใจว่าข้อมูลเข้า ยังคงเข้ากันได้กับระบบงาน และทำให้ระบบทำงานได้ตรงตามที่คาดหวัง แต่ถ้าข้อมูลเหล่านี้มันผิดปกติ หรือ ไม่เข้ากับการทำงานของระบบ มันย่อมทำให้เกิดผลลัพธ์ที่ไม่เป็นดังหวังเช่นกัน วิธีการตรวสอบข้อมูลเข้ามีหลากหลายวิธีซึ่งมีแนวทางดังนี้ เริ่มจาก Input validation เพื่อตรวจสอบข้อมูลตามชนิดที่ต้องการ เพื่อตรวจสอบข้อมูลตามช่วงที่ต้องการ ตัวอย่างเช่นข้อมูลราคาสินค้า ควรที่จะมีชนิดเป็นตัวเลข ควรที่จะมีค่าไม่ติดลบ ต่อมาเป็นวิธีการกำหนดขอบเขต หรือ จำกัดรูปแบบของข้อมูล เรียกว่า Whitelist หรือ positive validation เช่น- รูปแบบของวันที่
- รูปแบบของ URL
- ขนาดความยาวสูงสุดของข้อมูล
- อักขระพิเศษที่อนุญาต
แต่ถ้าจำนวนของ Whitelist มันเยอะมาก ๆ แนะนำให้เปลี่ยนเป็น Blacklist หรือ negative validation ซะจากนั้นพูดถึง feedback หรือ การบอกผู้ใช้งานให้รับรู้ ผลลัพธ์การตรวจสอบข้อมูลเข้าที่ไม่เป็นไปตามความต้องการ มีทางเลือกคือ
- แสดงผลการตรวจสอบทั้งหมด
- ไม่แสดงผลการตรวจสอบ
- แสดงข้อมูลแบบกลาง ๆ ไม่ลงรายละเอียด
โดยในปัจจุบันเรื่องของ Input Validation มันไม่ยาก (แต่ไม่ค่อยทำกัน !!)
เนื่องจากมีชุด library และ framework ให้ใช้งานมากมาย ยกตัวอย่างเช่น- Java มี Hibernate Validation และ Spring Bean Validation
- Ruby On Rails ก็มี Active Record Validator มาให้ใช้เลย
- Node.js มี validator-js
สุดท้ายแล้วฝากไว้ว่า
if you don't control it, you can't trust it. If it violates the contract, reject it!วันนี้ Developer รู้เรื่องการพัฒนา web ให้ปลอดภัยกันหรือยัง ? ถ้ายัง เริ่มได้แล้วนะครับข้อมูลเพิ่มเติมแนะนำที่