The Security Bugs Node.js Developers Ship to Production
בדקתי קוד עבור סטארט-אפ בשנה שעברה. הקוד נראה נקי. הבדיקות עברו בהצלחה.
ואז ראיתי את השורה הזו:
const query = SELECT * FROM users WHERE email = '${req.body.email}'
זהו באג של SQL injection. הסטארט-אפ הריץ את זה ב-production במשך 8 חודשים. אף מפתח או CTO לא זיהה זאת.
הבאגים האלה בלתי נראים כי הקוד עובד. הוא עובד עד שמשתמש מקליד פקודה זדונית בשדה קלט.
הפסיקו את 5 הטעויות הנפוצות האלה:
- Raw SQL with user input אל תשתמשו ב-template literals עבור שאילתות. זה מאפשר לתוקפים לגשת למסד הנתונים שלכם.
- רע: const query =
SELECT * FROM users WHERE email = '${email}' - טוב: השתמשו ב-parameterized queries. const query = 'SELECT * FROM users WHERE email = $1' db.query(query, [email])
Leaking secrets in Git מפתחים נוטים לעיתים קרובות לבצע commit לקבצי .env למאגרים (repositories). זה חושף את כתובות ה-URL של מסד הנתונים ואת מפתחות ה-API שלכם. תמיד הוסיפו את .env לקובץ ה-.gitignore שלכם.
Using jwt.decode instead of jwt.verify הפונקציה jwt.decode רק קוראת את ה-token. היא לא בודקת אם ה-token אמיתי. כל אחד יכול לזייף token מפורק (decoded).
- רע: const user = jwt.decode(token)
- טוב: תמיד ודאו את החתימה. const user = jwt.verify(token, process.env.JWT_SECRET)
- Missing rate limiting on auth endpoints ללא rate limiting, תוקפים יכולים לנסות מיליוני סיסמאות בשיטת brute force. השתמשו בספרייה כדי להגביל את ניסיונות ההתחברות.
- טוב: הוסיפו הגבלה של 10 ניסיונות לכל 15 דקות.
- Verbose error messages שליחת הודעות שגיאה גולמיות ללקוח (client) עוזרת לתוקפים למפות את המערכת שלכם. הם רואים את שמות הטבלאות ואת סוגי מסד הנתונים שלכם.
- רע: res.status(500).json({ error: error.message })
- טוב: תעדו (log) את השגיאה פנימית. שלחו הודעה כללית למשתמש. res.status(500).json({ error: 'Something went wrong' })
לפני שאתם מעלים (ship) נקודת קצה, שאלו שאלה אחת: מה קורה אם משתמש שולח נתונים לא צפויים?
באגים של אבטחה הם לעיתים רחוקות מורכבים. הם קורים כששוכחים לחשוב על גורמים זדוניים.
איזה באג אבטחה מצאתם ב-production?
Source: https://dev.to/manolito99/the-security-bug-every-nodejs-developer-ships-to-production-49e6
