La seguridad de una aplicación Node.js depende de sus , permisos y límites de recursos. HTTPS o una validación aislada no vuelven segura toda la aplicación.
// Inseguro: la shell interpreta metacaracteres.exec(`convert ${userInput}`);
Prefiere execFile o spawn con argumentos separados y una lista permitida de operaciones. No pases input externo a una shell sin una necesidad excepcional y controles estrictos.
No incluyas tokens, contraseñas, cookies, cuerpos sensibles ni variables completas en logs. Centraliza redacción y clasifica campos.
Un secreto en process.env sigue siendo accesible para el proceso y herramientas con permisos suficientes. Rota, limita acceso y evita heredarlo innecesariamente a child processes.
Para contraseñas utiliza una función específica de password hashing con parámetros actualizables. Una función hash rápida como SHA-256 sola no es apropiada.
timingSafeEqual exige buffers de igual longitud y solo resuelve una parte de los ataques de timing.
TLS cifra y autentica el canal cuando la validación de certificados es correcta. No protege contra autorización incorrecta, SQL injection, SSRF o datos sensibles en logs.
No desactives rejectUnauthorized en producción para resolver certificados.
Puede restringir filesystem, red, child processes, workers, addons, WASI e inspector según la versión y los flags disponibles.
JavaScript
process.permission.has("fs.read", configPath);
Es una defensa adicional para código confiable: evita accesos accidentales, pero la documentación oficial aclara que no es un sandbox frente a código malicioso.
Limitaciones relevantes:
Recursos ya abiertos no se revocan al retirar un permiso.
File descriptors existentes pueden evitar comprobaciones posteriores.
Symlinks requieren controles propios.
Algunos flags leen archivos antes de inicializar el modelo.
Addons y otras capacidades nativas amplían superficie.
Mantén además usuario sin privilegios, restricciones del sistema/container, secrets mínimos y revisión de dependencias.
Objetos construidos desde input pueden modificar claves especiales o afectar merges inseguros. Usa validación, esquemas, objetos sin prototipo cuando aporte y librerías actualizadas.
Nunca evalúes código recibido. JSON.parse no ejecuta código, pero el objeto resultante sigue siendo no confiable.
¿Por qué validar que una URL empiece por https:// no evita SSRF?
Respuesta
Porque un hostname HTTPS puede resolver a una dirección privada, redirigir a otro destino o cambiar su resolución. También debe controlarse el destino efectivo y la conexión.