Los errores de seguridad que los desarrolladores de Node.js envían a producción

El año pasado revisé el código de una startup. El código parecía limpio. Las pruebas pasaban.

Entonces vi esta línea: const query = \SELECT * FROM users WHERE email = '${req.body.email}'``

Este es un error de inyección SQL. La startup ejecutó esto en producción durante 8 meses. Ningún desarrollador ni CTO lo detectó.

Estos errores son invisibles porque el código funciona. Funciona hasta que un usuario escribe un comando malicioso en un campo de entrada.

Evita estos 5 errores comunes:

  1. SQL puro con entrada de usuario No utilices template literals para las consultas. Esto permite que los atacantes accedan a tu base de datos.
  • Mal: const query = \SELECT * FROM users WHERE email = '${email}'``
  • Bien: Usa consultas parametrizadas. const query = 'SELECT * FROM users WHERE email = $1' db.query(query, [email])
  1. Filtración de secretos en Git Los desarrolladores suelen hacer commit de archivos .env en los repositorios. Esto expone tus URLs de base de datos y claves de API. Añade siempre .env a tu archivo .gitignore.

  2. Usar jwt.decode en lugar de jwt.verify jwt.decode solo lee el token. No comprueba si el token es real. Cualquiera puede falsificar un token decodificado.

  • Mal: const user = jwt.decode(token)
  • Bien: Verifica siempre la firma. const user = jwt.verify(token, process.env.JWT_SECRET)
  1. Falta de rate limiting en los endpoints de autenticación Sin rate limiting, los atacantes pueden probar millones de contraseñas mediante fuerza bruta. Usa una librería para limitar los intentos de inicio de sesión.
  • Bien: Añade un límite de 10 intentos cada 15 minutos.
  1. Mensajes de error detallados Enviar mensajes de error sin procesar al cliente ayuda a los atacantes a mapear tu sistema. Pueden ver los nombres de tus tablas y los tipos de base de datos.
  • Mal: res.status(500).json({ error: error.message })
  • Bien: Registra el error internamente. Envía un mensaje genérico al usuario. res.status(500).json({ error: 'Something went wrong' })

Antes de enviar un endpoint, hazte una pregunta: ¿Qué pasa si un usuario envía datos inesperados?

Los errores de seguridad rara vez son complejos. Ocurren cuando olvidas pensar en los actores malintencionados.

¿Qué error de seguridad has encontrado en producción?

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