บั๊กด้านความปลอดภัยที่นักพัฒนา Node.js มักปล่อยขึ้น Production
ปีที่แล้วผมได้รีวิวโค้ดให้กับสตาร์ทอัพแห่งหนึ่ง โค้ดดูสะอาดตามาก และการทดสอบก็ผ่านหมด
แล้วผมก็ไปเจอโค้ดบรรทัดนี้:
const query = SELECT * FROM users WHERE email = '${req.body.email}'``
นี่คือบั๊ก SQL injection สตาร์ทอัพแห่งนี้รันโค้ดนี้บน production มานานถึง 8 เดือน โดยที่ไม่มีนักพัฒนาหรือ CTO คนไหนตรวจพบเลย
บั๊กเหล่านี้มองไม่เห็นด้วยตาเปล่าเพราะโค้ดยังคงทำงานได้ปกติ มันจะทำงานได้ดีจนกระทั่งมีผู้ใช้พิมพ์คำสั่งที่เป็นอันตรายลงในช่องกรอกข้อมูล
หยุดความผิดพลาดที่พบบ่อย 5 ประการนี้:
- การใช้ Raw SQL ร่วมกับข้อมูลจากผู้ใช้ อย่าใช้ template literals ในการเขียน query เพราะจะช่วยให้ผู้โจมตีสามารถเข้าถึงฐานข้อมูลของคุณได้
- แบบที่ผิด:
const query =SELECT * FROM users WHERE email = '${email}'`` - แบบที่ถูก: ใช้ parameterized queries
const query = 'SELECT * FROM users WHERE email = $1'db.query(query, [email])
การทำความลับรั่วไหลใน Git นักพัฒนามักจะ commit ไฟล์ .env ลงใน repository ซึ่งจะทำให้ URL ของฐานข้อมูลและ API keys ของคุณถูกเปิดเผย ควรเพิ่ม .env ลงในไฟล์ .gitignore เสมอ
การใช้ jwt.decode แทนที่จะเป็น jwt.verify jwt.decode ทำหน้าที่เพียงแค่อ่านข้อมูลจาก token เท่านั้น แต่มันไม่ได้ตรวจสอบว่า token นั้นเป็นของจริงหรือไม่ ใครก็สามารถปลอมแปลง token ที่ผ่านการ decode แล้วได้
- แบบที่ผิด:
const user = jwt.decode(token) - แบบที่ถูก: ตรวจสอบ signature เสมอ
const user = jwt.verify(token, process.env.JWT_SECRET)
- การขาดการทำ rate limiting บน auth endpoints หากไม่มีการทำ rate limiting ผู้โจมตีสามารถพยายามสุ่มรหัสผ่านนับล้านครั้งด้วยวิธี brute force ควรใช้ library เพื่อจำกัดจำนวนครั้งในการพยายามเข้าสู่ระบบ
- แบบที่ถูก: กำหนดขีดจำกัดไว้ที่ 10 ครั้ง ต่อ 15 นาที
- การแสดงข้อความ error ที่ละเอียดเกินไป การส่งข้อความ error แบบดิบๆ ไปยัง client จะช่วยให้ผู้โจมตีสามารถวิเคราะห์โครงสร้างระบบของคุณได้ พวกเขาจะเห็นชื่อ table และประเภทของฐานข้อมูลที่คุณใช้
- แบบที่ผิด:
res.status(500).json({ error: error.message }) - แบบที่ถูก: บันทึก error ไว้ภายในระบบ (log) และส่งข้อความทั่วไปไปให้ผู้ใช้
res.status(500).json({ error: 'Something went wrong' })
ก่อนที่คุณจะปล่อย endpoint ออกไป ให้ถามตัวเองคำถามหนึ่ง: จะเกิดอะไรขึ้นถ้าผู้ใช้ส่งข้อมูลที่ไม่คาดคิดมา?
บั๊กด้านความปลอดภัยมักไม่ได้ซับซ้อน แต่มันเกิดขึ้นเมื่อคุณลืมคิดถึงมุมมองของผู้ไม่หวังดี
คุณเคยพบความผิดพลาดด้านความปลอดภัยแบบไหนบ้างบน production?
Source: https://dev.to/manolito99/the-security-bug-every-nodejs-developer-ships-to-production-49e6
