I bug di sicurezza che gli sviluppatori Node.js rilasciano in produzione

L'anno scorso ho revisionato il codice di una startup. Il codice sembrava pulito. I test passavano.

Poi ho visto questa riga: const query = \SELECT * FROM users WHERE email = '${req.body.email}'``

Questo è un bug di SQL injection. La startup lo ha utilizzato in produzione per 8 mesi. Nessun developer o CTO se n'è accorto.

Questi bug sono invisibili perché il codice funziona. Funziona finché un utente non digita un comando malevolo in un campo di input.

Evita questi 5 errori comuni:

  1. SQL grezzo con input dell'utente Non usare i template literal per le query. Questo permette agli attaccanti di accedere al tuo database.
  • Sbagliato: const query = \SELECT * FROM users WHERE email = '${email}'``
  • Corretto: Usa le query parametrizzate. const query = 'SELECT * FROM users WHERE email = $1' db.query(query, [email])
  1. Esposizione di segreti in Git I developer spesso committano i file .env nei repository. Questo espone gli URL del database e le chiavi API. Aggiungi sempre .env al tuo file .gitignore.

  2. Usare jwt.decode invece di jwt.verify jwt.decode legge solo il token. Non controlla se il token è autentico. Chiunque può falsificare un token decodificato.

  • Sbagliato: const user = jwt.decode(token)
  • Corretto: Verifica sempre la firma. const user = jwt.verify(token, process.env.JWT_SECRET)
  1. Mancanza di rate limiting sugli endpoint di autenticazione Senza il rate limiting, gli attaccanti possono provare milioni di password tramite brute force. Usa una libreria per limitare i tentativi di login.
  • Corretto: Aggiungi un limite di 10 tentativi ogni 15 minuti.
  1. Messaggi di errore troppo dettagliati Inviare messaggi di errore grezzi al client aiuta gli attaccanti a mappare il tuo sistema. Vedono i nomi delle tabelle e i tipi di database.
  • Sbagliato: res.status(500).json({ error: error.message })
  • Corretto: Registra l'errore internamente. Invia un messaggio generico all'utente. res.status(500).json({ error: 'Something went wrong' })

Prima di rilasciare un endpoint, fatti una domanda: Cosa succede se un utente invia dati inaspettati?

I bug di sicurezza sono raramente complessi. Succedono quando dimentichi di pensare agli attori malevoli.

Quale bug di sicurezza hai trovato in produzione?

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