Skip to main content

Comparación de frameworks web de Node.js: ¿cuál es el más seguro?

Escrito por
prioritize the security backlog

8 de marzo de 2023

0 minutos de lectura

JavaScript es el lenguaje de programación más popular del mundo y ofrece muchos frameworks web que ayudan a los desarrolladores a crear aplicaciones web Node.js seguras y confiables. Cada framework tiene características únicas. El más adecuado para ti depende de tus preferencias y del tipo de aplicación que quieras crear. 

Con tantos frameworks disponibles, necesitas una forma de evaluar su seguridad. En este artículo, analizaremos tres frameworks populares —Express.js, NestJS y Fastify— y evaluaremos en qué medida se apegan a las prácticas recomendadas de seguridad de Node.js.

Comparación de la seguridad de los frameworks web de Node.js

Todos los frameworks web basados en JavaScript se ejecutan sobre el entorno de ejecución de Node.js. Las aplicaciones del ecosistema npm suelen combinar muchas dependencias de npm para agregar funcionalidades. Por lo tanto, sin importar qué framework usemos, las vulnerabilidades en Node.js y en las dependencias de npm probablemente afectarán la aplicación. La seguridad de nuestra aplicación depende de adoptar prácticas recomendadas y principios de diseño durante el desarrollo.

Los frameworks web nos alientan a usar los paquetes más recientes y actualizarlos con regularidad. Ofrecen una capa de abstracción que reduce la posibilidad de que alguien acceda a la aplicación sin autorización. Por estos motivos, debemos usar un framework web al crear aplicaciones. 

En las siguientes secciones, analizaremos y compararemos las capacidades de seguridad de estos tres frameworks de Node.js.

Express.js

Express.js es un framework web rápido y minimalista para Node.js, diseñado para crear aplicaciones web y API con los stacks MERN o MEAN. Este framework alienta a los desarrolladores a seguir sus numerosas prácticas recomendadas de seguridad antes de implementar sus aplicaciones en producción. Además, Express.js sigue las prácticas recomendadas de seguridad de Node.js y ofrece varias recomendaciones para cumplirlas:

Prevención de ataques de fuerza bruta 

La práctica recomendada 6.12 de Node.js aborda la prevención de ataques de fuerza bruta contra los mecanismos de autorización. Esta práctica recomienda implementar una estrategia para limitar la cantidad de intentos de inicio de sesión en rutas sensibles, como /admin o /login, y así reducir el riesgo de ataques de fuerza bruta y de diccionario contra las contraseñas. Podemos lograrlo con el paquete npm rate-limiter-flexible, que limita los intentos de inicio de sesión según la dirección IP de origen de la solicitud o parámetros del cuerpo de la solicitud, como el nombre de usuario o la dirección de correo electrónico. Con base en estas propiedades, podemos crear un limitador que cuente y restrinja la cantidad de intentos fallidos consecutivos. Luego, podemos agregar otro limitador que bloquee una dirección IP durante un período determinado cuando se alcance el límite de intentos fallidos consecutivos. Express.js sigue esta recomendación al sugerir el uso del mismo paquete npm y bloquear los intentos de autorización según las mismas métricas.

Garantizar la seguridad de las expresiones regulares 

La práctica recomendada 6.16 de Node.js recomienda usar paquetes de terceros para validar expresiones regulares, como validator.js y safe-regex, con el fin de detectar patrones vulnerables. Desaconseja implementar tus propios patrones de expresiones regulares, ya que los que están mal escritos son susceptibles a ataques DoS mediante expresiones regulares y pueden explotarse fácilmente para bloquear por completo los bucles de eventos.

Configurar correctamente los encabezados HTTP 

La práctica recomendada 6.6 recomienda usar encabezados seguros para proteger las aplicaciones contra vulnerabilidades como el cross-site scripting, el secuestro de cookies y el clickjacking. Anteriormente, Express.js tuvo una vulnerabilidad de seguridad en el módulo forwarded, que procesa el encabezado X-Forwarded-For. Para explotar esta debilidad, un actor malicioso podía estructurar una consulta que, al analizarse, bloqueara un bucle de eventos necesario y provocara una respuesta de denegación de servicio. Para prevenir esta y otras vulnerabilidades similares, Express.js incorpora Helmet, que facilita la configuración de nuestros encabezados de seguridad y permite cumplir las prácticas recomendadas de Node.js. 

NestJS

NestJS es un framework para aplicaciones web muy inspirado en Angular, un framework de frontend. NestJS está diseñado para crear aplicaciones de backend escalables. Como capa envolvente de Fastify o Express, NestJS suele ser tan seguro como esos frameworks. La principal ventaja de Nest es su arquitectura y estructura, que podemos aprovechar al desarrollar nuestra aplicación.

NestJS está desarrollado con TypeScript y es compatible con este lenguaje, lo que nos permite crear aplicaciones más fáciles de mantener y más complejas. También incluye guards, que pueden determinar si un controlador de ruta debe gestionar una solicitud específica.

Diagrama de flujo que muestra una solicitud HTTP que viaja desde el lado del cliente, pasa por un guard y llega a un controlador de rutas

Este framework sigue las prácticas recomendadas de seguridad de Node.js de varias maneras:

Cifrado y hashing 

La práctica recomendada 6.8 aconseja aplicar hashing a los datos confidenciales de los usuarios (por ejemplo, las contraseñas) en lugar de almacenarlos como texto sin formato. Esta práctica enumera tres funciones que se deben usar como mínimo, pero también recomienda utilizar parámetros de nivel superior y combinaciones únicas para cada programa, lo que ayuda a mitigar los daños si un actor malicioso descubre un método de hash. Además, recomienda agregar un salt antes de aplicar hashing a las contraseñas. NestJS sigue esta práctica al recomendar el cifrado y el hashing de la información. Para el cifrado, este framework promueve el uso del módulo crypto integrado. Para el hashing, recomienda los paquetes bcrypt o argon2.

Validación de solicitudes entrantes

La práctica recomendada 6.10 de Node.js aconseja validar el cuerpo de las solicitudes entrantes. Esto implica definir qué carga útil debe aceptar la aplicación y rechazar de inmediato cualquier otra. Así se ayudan a reducir los ataques DDoS, ya que un atacante no puede enviar cargas útiles personalizadas con una estructura, un valor o una longitud distintos. NestJS facilita la implementación de esta práctica porque incluye varios pipes que se pueden usar para realizar la validación.

Modificación de la configuración del middleware de sesión

La práctica recomendada 6.22 de Node.js aconseja ajustar la configuración predeterminada de las cookies para proteger mejor a los usuarios y las aplicaciones, reduciendo ataques como la identificación y el secuestro de sesiones. NestJS facilita la implementación de esta práctica al ofrecer una manera de modificar la configuración de las sesiones. Una vulnerabilidad de seguridad que afectó a este framework se encontró en el módulo @finastra/nestjs-proxy, un módulo proxy de NestJS. Las versiones afectadas de este paquete eran vulnerables a la exposición de información porque reenviaban cookies confidenciales de forma predeterminada.

Fastify

Fastify es un framework web para Node.js que busca ser rápido y tener poca sobrecarga. Inspirado en Hapi y Express, está diseñado para ofrecer una base sencilla y estable para crear aplicaciones y servicios web. Fastify tiene una base de código mínima y ofrece una configuración declarativa y simple que permite a los desarrolladores poner un servidor en funcionamiento rápidamente. 

Este framework sigue las prácticas recomendadas de seguridad de Node.js y recomienda:

Usar fastify/rate-limit para limitar las solicitudes de los clientes

Esto se apega a la práctica recomendada 6.12. Según esta práctica, limitar la frecuencia de las solicitudes ayuda a prevenir ataques de fuerza bruta contra la autorización en rutas con privilegios elevados, como /login y /admin. Para limitar la frecuencia, se pueden crear limitadores basados en dos métricas, como se explica aquí.

Usar fastify/helmet para establecer encabezados de seguridad importantes

Esto se apega a la práctica recomendada 6.6. Configurar los encabezados de seguridad adecuados protege tu aplicación contra el cross-site scripting, el clickjacking y otros ataques.

Usar el plugin fastify-cockroachdb, proporcionado por la comunidad

Este plugin permite a los desarrolladores conectarse a una instancia de CockroachDB PostgreSQL a través del ORM Sequelize. Según la práctica recomendada 6.4, las bibliotecas ORM/DRM ayudan a prevenir inyecciones SQL/NoSQL al evitar el uso de la concatenación de cadenas de JavaScript y los template strings, que exponen las aplicaciones a diversos tipos de ataque. Este enfoque también respalda el uso de bibliotecas de acceso a datos confiables, como Sequelize, Knex y mongoose, ya que ofrecen protección integrada contra ataques de inyección.

Limitar las solicitudes simultáneas

La práctica recomendada 6.2 de Node.js promueve la implementación de un limitador de frecuencia, que puede ayudar a evitar demasiadas solicitudes simultáneas, la base de los ataques DoS. Esta práctica recomienda usar un servicio diseñado para esta tarea. Fastify ofrece el plugin @fastify/rate-limit para ayudar a lograrlo.

Eliminar los secretos de los archivos de configuración

La práctica recomendada 6.3 de Node.js aconseja almacenar las claves y los secretos cifrados o usar variables de entorno. Si se almacenan como texto sin formato, pueden quedar expuestos. Fastify sigue esta práctica con el plugin @fastify/env, que permite verificar y cargar archivos de configuración. Aun así, se debe evitar cargar secretos desde variables de entorno y recurrir a esta opción solo como último recurso.

Una limitación de seguridad de este framework es que no ofrece compatibilidad con listas de bloqueo para JSON Web Tokens (JWT). Bloquear JWT ayuda a garantizar que un atacante no pueda usar tokens vencidos o extraviados para hacerse pasar por su titular.

Un ejemplo reciente de una vulnerabilidad de seguridad en este framework es el ataque DoS que afectó a algunas de sus versiones.

Cómo elegir el framework adecuado

Todos los frameworks web que analizamos en este artículo cumplen las prácticas recomendadas de seguridad en un nivel aceptable. Sin embargo, NestJS es el que más se apega a las prácticas recomendadas de seguridad de Node.js, ya que proporciona una capa de abstracción sobre Express.js con funciones de seguridad integradas, lo que dificulta que los atacantes accedan al sistema. 

Cada uno de los frameworks analizados tiene sus fortalezas y casos de uso ideales. Además, todos admiten paquetes adicionales que puedes integrar para crear aplicaciones seguras y sólidas.

Por ejemplo, Express.js es el framework más popular y consolidado, con excelente documentación y un amplio respaldo de la comunidad.

NestJS es una buena opción para aplicaciones escalables porque incluye muchos paquetes, ofrece una capa de abstracción sobre Express.js y es compatible con TypeScript. Por último, Fastify se enfoca en aplicaciones web rápidas y eficientes sin sacrificar la seguridad.

Sin importar qué framework uses, como desarrollador debes seleccionar las dependencias adecuadas y seguir las prácticas recomendadas de seguridad al crear una aplicación web. También es fundamental actualizar los paquetes a sus versiones más recientes para eliminar vulnerabilidades conocidas.

Comienza con Capture the Flag

Aprende a resolver desafíos de Capture the Flag con nuestro taller virtual 101 a pedido.

Leer más

blog feature snyk container custom base recommendations
Blog

Presentamos Evo Agentic AppSec: seguridad al ritmo del desarrollo con IA

El desarrollo impulsado por IA supera el ritmo de los flujos de trabajo de seguridad tradicionales. Agentic AppSec de Snyk usa agentes de seguridad para encontrar, corregir y verificar vulnerabilidades de forma continua, mientras las personas definen el estándar.

feature insights context
Blog

Los ataques autónomos ya están aquí. La defensa debe estar a su altura.

Los atacantes autónomos están reduciendo el tiempo disponible para defenderse. Descubre cómo el descubrimiento, la corrección, la validación y la prevención continuos pueden ayudar a los equipos de seguridad a seguirles el ritmo.

illustration hero ai
Blog

El huracán de la IA ha llegado

La IA está acelerando por igual la creación de software y los ciberataques. Los líderes deben proteger los agentes y el código desde el inicio, aplicar controles en tiempo de ejecución y validar las defensas de forma independiente.