websecuritybasics
จากบทความเรื่อง The Basics of Web Application Security
ได้ทำการอธิบายเกี่ยวกับการพัฒนา web application อย่างไรให้มีความปลอดภัย
โดยเน้นไปที่พื้นฐานของการพัฒนา
ซึ่งมีความน่าสนใจและสำคัญอย่างมาก
สำหรับ developer หน้าใหม่และประสบการณ์ยังไม่เยอะ

ดังนั้น จึงทำการแปลและสรุปส่วนที่น่าสนใจไว้นิดหน่อย
มาเริ่มกันเลย

ในการพัฒนา web application นั้น มีสิ่งที่ท้าทายเยอะมาก

ความท้าทายในอันดับต้น ๆ ก็คือ เรื่องความปลอดภัย (Security)
แต่บ่อยครั้งที่มักถูกหลงลืม หรือ ปล่อยปละละเลยไป !!

เรื่องของการพัฒนา web application ให้มีความปลอดภัยนั้น
มีเทคนิค หรือ วิธีการมากมายทั้งยากและง่าย
แต่ก่อนอื่น Developer ควรเรียนรู้และทำความเข้าใจกับพื้นฐานก่อน
เช่น เรื่องการตรวจสอบ input เป็นต้น

Developer บางคนอาจจะบอกว่า
แค่พัฒนาระบบให้เสร็จตามความต้องการของลูกค้าก็ยากอยู่แล้ว
ให้ระบบทำงานรวดเร็วก็ยากขึ้นไปอีก
ไหนจะต้องเขียน code ให้ดีอีก
ไหนจะต้องเขียน code ให้รองรับการขยายอีก
ไหนจะต้อง ….
ไหนจะต้องเรื่องความน่าเชื่อถือ
ไหนจะต้องเรื่องความเสถียร
… มันเยอะไปหมดเลย

ส่วนเรื่องของความปลอดภัยมันมักจะอยู่ท้าย ๆ ของ requirment
มักถูกละเลย ไม่สนใจ
แต่เมื่อใดก็ตามระบบงานมันทำงานผิดพลาด
หรือไม่เป็นไปทำที่เราต้องการ
เมื่อนั้นแหละ เรื่องความปลอดภัยมันจะสำคัญอย่างมาก
ถ้าไม่โดนกับตัวเอง จะไม่รู้สึก และ เข้าใจ !!

ก่อนอื่นต้องเข้าใจก่อนว่า

เรื่องของความปลอดภัยคือ เรื่องของความไว้ใจล้วน ๆ
ลองถามตัวเองสิว่า

  • คุณไว้ใจข้อมูลที่ส่งมาจากผู้ใช้งานว่าถูกต้องเสมอหรือไม่ ?
  • คุณไว้ใจว่าการเชื่อมต่อระหว่างระบบกับผู้ใช้งานจะไม่ถูกดักฟัง หรือ ขโมย ?
  • คุณไว้ใจระบบของคุณว่าข้อมูลต่าง ๆ มันถูกต้อง และ ปลอดภัยหรือไม่ ?

เชื่อได้เลยว่า คุณไม่ค่อยมั่นใจว่าจะไว้ใจได้ !!!
เรื่องพวกนี้คือ ความเสี่ยงล้วน ๆ (Risk)
ดังนั้นในฐานะของ Developer
ต้องลดความเสี่ยงเหล่านี้ลงไป ให้ได้มากที่สุด

สิ่งแรกที่ Developer ทุกคนควรทำก็คือ การจัดการกับข้อมูลเข้า (Input)

ต้องทำการปฏิเสธข้อมูลที่ไม่เป็นไปตามที่ระบบต้องการ หรือ คาดหวังเสมอ

Developer บางคนบอกว่า
เราทำการตรวจสอบข้อมูลต่าง ๆ จากผู้ใช้งานด้วย JavaScript นะ
แต่ในมุมมองของความปลอดภัยแล้ว
บอกได้เลยว่า มันไม่มีประโยชน์อะไรเลย
เพราะว่า ผู้ใช้งานเพียงปิด JavaScript
หรือ ทำการจำลอง request การส่งข้อมูลมายัง server
เพียงเท่านี้ JavaScript ก็หมดความหมายไปในทันที

ให้เริ่มด้วยการอย่าไว้ใจข้อมูลเข้า (Input) ใด ๆ ทั้งสิ้น
HTTPS ก็ช่วยอะไรไม่ได้นะครับ มันคนละเรื่อง
ดังนั้น ฝั่ง server ต้องทำการตรวจสอบข้อมูลเข้าเสมอ

ลองถามตัวเราเองสิว่า
วันนี้ทำการตรวจสอบข้อมูลเข้ากันหรือยัง เช่น

  • ชนิดของข้อมูลมันตรงตามที่ต้องการหรือไม่ ?
  • รูปแบบข้อมูลตรงตามที่ต้องการหรือไม่ ?
  • ข้อมูลมันส่งผลกระทบต่อการประมวลผลของระบบหรือไม่ ?
  • ข้อมูลมีขนาดใหญ่เกินที่ต้องการหรือไม่ ?

ถ้ายัง รีบกลับไปแก้ไขได้เลย !!
เพื่อลดปัญหา และ ลดอันตรายต่าง ๆ ที่จะเกิดขึ้นต่อระบบ
นั่นคือ เรื่องของ Input Validation นั่นเอง
มันไม่ใช่เรื่องใหม่เลยนะ
แต่มักละเลยกันอย่างมาก !!!

Input Validation คืออะไรกัน ?

เป็นกระบวนการเพื่อทำให้มั่นใจว่าข้อมูลเข้า
ยังคงเข้ากันได้กับระบบงาน
และทำให้ระบบทำงานได้ตรงตามที่คาดหวัง

แต่ถ้าข้อมูลเหล่านี้มันผิดปกติ หรือ ไม่เข้ากับการทำงานของระบบ
มันย่อมทำให้เกิดผลลัพธ์ที่ไม่เป็นดังหวังเช่นกัน

วิธีการตรวสอบข้อมูลเข้ามีหลากหลายวิธีซึ่งมีแนวทางดังนี้
เริ่มจาก Input validation
เพื่อตรวจสอบข้อมูลตามชนิดที่ต้องการ
เพื่อตรวจสอบข้อมูลตามช่วงที่ต้องการ

ตัวอย่างเช่นข้อมูลราคาสินค้า
ควรที่จะมีชนิดเป็นตัวเลข
ควรที่จะมีค่าไม่ติดลบ

ต่อมาเป็นวิธีการกำหนดขอบเขต หรือ จำกัดรูปแบบของข้อมูล เรียกว่า Whitelist หรือ positive validation
เช่น

  • รูปแบบของวันที่
  • รูปแบบของ URL
  • ขนาดความยาวสูงสุดของข้อมูล
  • อักขระพิเศษที่อนุญาต

แต่ถ้าจำนวนของ Whitelist มันเยอะมาก ๆ
แนะนำให้เปลี่ยนเป็น Blacklist หรือ negative validation ซะ

จากนั้นพูดถึง feedback หรือ การบอกผู้ใช้งานให้รับรู้
ผลลัพธ์การตรวจสอบข้อมูลเข้าที่ไม่เป็นไปตามความต้องการ
มีทางเลือกคือ

  • แสดงผลการตรวจสอบทั้งหมด
  • ไม่แสดงผลการตรวจสอบ
  • แสดงข้อมูลแบบกลาง ๆ ไม่ลงรายละเอียด

จะเลือกทางไหน มันขึ้นอยู่กับความต้องการของแต่ละระบบ

แต่อย่างหนึ่งที่ต้องมีคือ
เขียนและบันทึกผลการทำงานต่าง ๆ ลงใน logging และ monitoring เสมอ

อีกข้อควรระวัง คือ การนำข้อมูลเข้ามาแสดงให้ผู้ใช้งานเห็น
ต้องทำการกรองข้อมูล และ ทำความสะอาดข้อมูลก่อนเสมอ
มิเช่นนั้นมันก็จะกลายเป็นภัย
หรือช่องโหว่ให้โจมตีระบบได้อีก
เรามักจะเรียกว่า XSS attack (Cross Site Scripting) นั่นเอง

โดยในปัจจุบันเรื่องของ Input Validation มันไม่ยาก (แต่ไม่ค่อยทำกัน !!)

เนื่องจากมีชุด library และ framework ให้ใช้งานมากมาย
ยกตัวอย่างเช่น

  • Java มี Hibernate Validation และ Spring Bean Validation
  • Ruby On Rails ก็มี Active Record Validator มาให้ใช้เลย
  • Node.js มี validator-js

ส่วนวิธีการพื้นฐานสุด ๆ มันก็คือ Regular expression
ซึ่ง developer ควรมีความรู้ความเข้าใจนะ

สุดท้ายแล้วฝากไว้ว่า

if you don’t control it, you can’t trust it.
If it violates the contract, reject it!

วันนี้ Developer รู้เรื่องการพัฒนา web ให้ปลอดภัยกันหรือยัง ?
ถ้ายัง เริ่มได้แล้วนะครับ

ข้อมูลเพิ่มเติมแนะนำที่