Web Security Lesson #1

ผมไม่ได้เขียน blog มาหลายวันละ เพราะว่า มัวแต่ up status ตัวเอง ลง Facebook
วันนี้ เลยอยากมาเขียน blog ในกึ่งวิชาการนิดๆ หน่อยๆ เพราะว่า ที่ผ่านมา เจอกับ
การละเลยเรื่อง security กันมากเหลือเกิน อันจะนำไปสู่ ความวุ่นวาย ในอนาคตได้
แต่ผมจะไม่ได้เจาะลึกมาก ถ้าอยากรู้ลึกกว่านี้ ต้องไปศึกษา ทดลองกันเองครับ ..

สิ่งที่ผมอยากจะเขียนในวันนี้ ก็คือ เรื่องการเก็บรายละเอียดของ user และ password
และรายละเอียดต่างๆ นาๆ ของ user ที่เข้ามาใช้งานระบบ ส่วนใหญ่ตรงนี้
บางทีเราไม่ได้ให้ความสำคัญกันเท่าไร บางทีเก็บ password แบบ paintext คือ
ไม่ได้เข้ารหัสอะไรเลย ใส่อะไรมาเก็บแบบนั้น ดีขึ้นมาหน่อย ก็ md5 แต่ว่ามันก็แกะไม่ยาก
มาอีกหน่อยก็ base64 ซึ่งทุกอย่างที่ว่ามานี้ มัน ไม่ปลอดภัยเลยจริงๆ ถ้ามีใครได้ data
ในส่วนนี้ไป มันไม่อันตรายเฉพาะแค่นี้ แต่มันอันตรายมากๆ เพราะว่า เมื่อมีข้อมูล ของคนคนนึง
hacker สามารถ ไปต่อยอดได้เยอะ เพราะว่า คนคนเดียวกัน มักจะใช้ password เดิมๆ
ในทุกๆ เว็บที่เข้าใช้งาน ..
ส่วนถ้าจะถามผมว่า จะเก็บแบบไหนดี ผมว่า การเข้ารหัส โดยใช้ Private Key น่าจะดีสุด
หรือไม่ก็สร้าง function สำหรับการเข้ารหัส password เอง ก็จะดีกว่า function มาตรฐาน
ตรงนี้ แค่การเก็บ data ของ user ก็ต้องคำนึงถึงเยอะแล้ว ..

อีกส่วนนึง ก็คือส่วนของการ login ผมเจอหลายๆ case มากๆ ที่ง่ายสุดก็คือ มี form
แล้วมี hidden ไว้ ว่า password ที่ต้องกรอกคืออะไร ถ้าถูก ก็ให้ผ่าน อันนี้ สมัยก่อน
ก็อาจจะใช้กัน ผมเองเขียนโปรแกรมแรกๆ ก็ใช้วิธีนี้ เพราะไม่มี idea ที่จะเขียนแบบอื่น
ไม่ได้เก็บ data ลง DB แบบสม้ยนี้ แต่เก็บลง text file ทั้งหมด ..
ที่เจอต่อมาก็คือ check cookies หรือ sessions ว่ามีหรือเปล่า ถ้ามี ก็ให้ผ่านเข้าระบบ
ไปในส่วน admin ได้ ซึ่งตรงนี้ เราสามารถแก้ไขหรือปลอม cookies และ sessions ได้ครับ
ทำให้เข้าระบบได้โดยง่าย หรืออีกอย่างนึงก็คือ cookies ไม่ได้มีการเข้ารหัสอะไรเลย
ก็ทำให้เราแก้ไข cookies แล้วเข้าใช้งาน account ของคนอื่นได้ อันนี้ก็เป็นปัญหา ..

อีกอย่างนึงก็คือ ไม่มีการกรองค่าที่ส่งเข้าไป ปล่อยให้มีการใช้ SQL Injection เข้าไปได้
ทำให้ สามารถเข้าระบบได้ง่ายๆ อย่างเช่น ใส่ password=aa’ or 1 like ‘1 แบบนี้
ถ้าไม่มีการกรอง ระบบก็จะหลุดให้เข้าไปได้ เพราะว่า 1 like 1 เป็น true เสมอ ..
ตรงนี้รายละเอียดเยอะมาก ไว้ผมจะพูดละเอียดอีกครั้งครับ ..

สุดท้ายก็คือ ระบบการ forget password ที่ไม่ดีพอ ที่ให้ใครที่รู้ user หรือ email สามารถ
ไป forget password ได้ โดยส่ง password ง่ายๆ มาให้ทาง mail ไม่ต้องมีการ activate
จาก link ที่ส่งให้ เพื่อไปเปลี่ยน password ใหม่ แบบนี้ ก็ทำให้ hacker เดาทางถูก
แค่ Brute Force ง่ายๆ เข้าไป ก็ได้ password ละ เพราะว่าไม่ได้มีการ check
ค่าที่ได้ เวลา login ผิด กับ ถูก มันออกมาต่างกันอยู่แล้ว จับทางตรงนี้ได้ ก็จบ ได้
password ง่ายๆ ..

ผมขอพูดถึงแค่นี้ก่อนนะครับ แล้วจะมาเล่าเรื่อง Web Security อื่นๆ ที่เราควรคำนึง
ให้ฟังอีกวันหลังครับ 🙂