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:
- 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])
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.
Usare jwt.decode invece di jwt.verify
jwt.decodelegge 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)
- 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.
- 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
