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 הטעויות הנפוצות האלה:

  1. 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])
  1. Leaking secrets in Git מפתחים נוטים לעיתים קרובות לבצע commit לקבצי .env למאגרים (repositories). זה חושף את כתובות ה-URL של מסד הנתונים ואת מפתחות ה-API שלכם. תמיד הוסיפו את .env לקובץ ה-.gitignore שלכם.

  2. 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)
  1. Missing rate limiting on auth endpoints ללא rate limiting, תוקפים יכולים לנסות מיליוני סיסמאות בשיטת brute force. השתמשו בספרייה כדי להגביל את ניסיונות ההתחברות.
  • טוב: הוסיפו הגבלה של 10 ניסיונות לכל 15 דקות.
  1. 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