Die Sicherheitslücken, die Node.js-Entwickler in die Produktion bringen

Letztes Jahr habe ich den Code für ein Startup überprüft. Der Code sah sauber aus. Die Tests liefen durch.

Dann sah ich diese Zeile: const query = \SELECT * FROM users WHERE email = '${req.body.email}'``

Das ist ein SQL-Injection-Bug. Das Startup hat dies 8 Monate lang in der Produktion laufen lassen. Kein Entwickler und kein CTO hat es bemerkt.

Diese Bugs sind unsichtbar, weil der Code funktioniert. Er funktioniert so lange, bis ein Benutzer einen bösartigen Befehl in ein Eingabefeld eingibt.

Vermeiden Sie diese 5 häufigen Fehler:

  1. Rohes SQL mit Benutzereingaben Verwenden Sie keine Template-Literals für Abfragen. Dies ermöglicht es Angreifern, auf Ihre Datenbank zuzugreifen.
  • Schlecht: const query = \SELECT * FROM users WHERE email = '${email}'``
  • Gut: Verwenden Sie parametrisierte Abfragen. const query = 'SELECT * FROM users WHERE email = $1' db.query(query, [email])
  1. Geheimnisse in Git preisgeben Entwickler committen oft .env-Dateien in Repositories. Dies legt Ihre Datenbank-URLs und API-Keys offen. Fügen Sie .env immer Ihrer .gitignore-Datei hinzu.

  2. Verwendung von jwt.decode anstelle von jwt.verify jwt.decode liest den Token nur aus. Es prüft nicht, ob der Token echt ist. Jeder kann einen dekodierten Token fälschen.

  • Schlecht: const user = jwt.decode(token)
  • Gut: Verifizieren Sie immer die Signatur. const user = jwt.verify(token, process.env.JWT_SECRET)
  1. Fehlendes Rate Limiting bei Auth-Endpoints Ohne Rate Limiting können Angreifer Millionen von Passwörtern mittels Brute-Force ausprobieren. Verwenden Sie eine Library, um Login-Versuche zu begrenzen.
  • Gut: Fügen Sie ein Limit von 10 Versuchen pro 15 Minuten hinzu.
  1. Ausführliche Fehlermeldungen Das Senden von rohen Fehlermeldungen an den Client hilft Angreifern, Ihr System zu kartieren. Sie sehen Ihre Tabellennamen und Datenbanktypen.
  • Schlecht: res.status(500).json({ error: error.message })
  • Gut: Protokollieren Sie den Fehler intern. Senden Sie eine generische Nachricht an den Benutzer. res.status(500).json({ error: 'Something went wrong' })

Bevor Sie einen Endpoint ausliefern, stellen Sie sich eine Frage: Was passiert, wenn ein Benutzer unerwartete Daten sendet?

Sicherheitslücken sind selten komplex. Sie entstehen, wenn man vergisst, an böswillige Akteure zu denken.

Welche Sicherheitslücke haben Sie schon einmal in der Produktion gefunden?

Quelle: https://dev.to/manolito99/the-security-bug-every-nodejs-developer-ships-to-production-49e6