Skip to main content

Comparatif des frameworks web Node.js : lequel est le plus sécurisé ?

Écrit par
prioritize the security backlog

8 mars 2023

0 minutes de lecture

JavaScript est le langage de programmation le plus populaire au monde et propose de nombreux frameworks web qui aident les développeurs à créer des applications web Node.js sécurisées et fiables. Chaque framework possède des fonctionnalités qui lui sont propres. Le choix le plus adapté dépend de vos préférences et du type d’application que vous souhaitez créer.

Face à la multitude de frameworks disponibles, vous avez besoin d’un moyen d’évaluer leur sécurité. Dans cet article, nous allons examiner trois frameworks populaires — Express.js, NestJS et Fastify — et évaluer leur conformité aux bonnes pratiques de sécurité Node.js.

Comparaison de la sécurité des frameworks web Node.js

Tous les frameworks web basés sur JavaScript s’appuient sur l’environnement d’exécution Node.js. Les applications de l’écosystème npm combinent généralement de nombreuses dépendances npm qui ajoutent des fonctionnalités à votre application. Par conséquent, quel que soit le framework utilisé, les vulnérabilités de Node.js et des dépendances npm sont susceptibles d’affecter l’application. La sécurité de notre application dépend de l’adoption de bonnes pratiques et de principes de conception lors du développement.

Les frameworks web nous incitent à utiliser les versions les plus récentes des packages et à les mettre régulièrement à jour. Ils fournissent une couche d’abstraction qui réduit les risques d’accès non autorisé à l’application. Pour ces raisons, nous devrions utiliser un framework web lors de la création d’applications.

Dans les sections suivantes, nous allons examiner et comparer les fonctionnalités de sécurité de ces trois frameworks Node.js.

Express.js

Express.js est un framework web Node.js rapide et minimaliste, conçu pour créer des applications web et des API avec les stacks MERN ou MEAN. Avant de déployer leurs applications en production, ce framework invite les développeurs à suivre ses nombreuses bonnes pratiques de sécurité. Par ailleurs, Express.js suit les bonnes pratiques de sécurité Node.js et formule de nombreuses recommandations en la matière :

Prévenir les attaques par force brute

La bonne pratique 6.12 de Node.js porte sur la prévention des attaques par force brute visant les mécanismes d’autorisation. Elle recommande de mettre en place une stratégie limitant le nombre de tentatives de connexion sur des routes sensibles, comme /admin ou /login, afin de réduire les risques d’attaques par force brute ou par dictionnaire visant les mots de passe. Pour ce faire, vous pouvez utiliser le package npm rate-limiter-flexible afin de limiter les tentatives de connexion en fonction de l’adresse IP source de la requête ou de paramètres du corps de la requête, comme le nom d’utilisateur ou l’adresse e-mail. À partir de ces propriétés, vous pouvez créer un limiteur qui comptabilise et restreint le nombre d’échecs consécutifs. Vous pouvez ensuite en ajouter un autre qui bloque une adresse IP pendant une durée définie lorsqu’elle atteint le seuil d’échecs consécutifs. Express.js suit cette recommandation en conseillant d’utiliser le même package npm et de bloquer les tentatives d’autorisation en fonction des mêmes critères.

Garantir la sécurité des expressions régulières

La bonne pratique 6.16 de Node.js recommande d’utiliser des packages tiers de validation des expressions régulières, tels que validator.js et safe-regex, pour détecter les motifs vulnérables. Elle déconseille de créer vos propres expressions régulières, car celles qui sont mal écrites sont vulnérables aux attaques DoS par expression régulière et peuvent facilement être exploitées pour bloquer complètement les boucles d’événements.

Configurer correctement les en-têtes HTTP

La bonne pratique 6.6 recommande d’utiliser des en-têtes sécurisés pour protéger les applications contre des vulnérabilités telles que les scripts intersites, le détournement de cookies et le clickjacking. Express.js a déjà été concerné par une vulnérabilité de sécurité dans le module forwarded, qui gère l’en-tête X-Forwarded-For. Pour exploiter cette faille, un acteur malveillant pouvait élaborer une requête qui, une fois analysée, bloquait une boucle d’événements nécessaire et provoquait un déni de service. Pour prévenir cette vulnérabilité et d’autres du même type, Express.js intègre Helmet, qui permet de configurer facilement les en-têtes liés à la sécurité et de respecter les bonnes pratiques Node.js.

NestJS

NestJS est un framework d’applications web fortement inspiré d’Angular, un framework front-end. NestJS est conçu pour créer des applications back-end évolutives. Comme NestJS s’appuie sur Fastify ou Express, sa sécurité dépend généralement de celle de ces frameworks. Son principal avantage réside dans les conceptions architecturales et structurelles qu’il propose et que vous pouvez utiliser pour développer votre application.

NestJS repose sur TypeScript et le prend en charge, ce qui permet de créer des applications plus faciles à maintenir et plus complexes. Il propose également des guards, qui déterminent si un gestionnaire de route doit traiter une requête donnée.

Schéma illustrant une requête HTTP qui passe du côté client à un gestionnaire de route via un garde-fou

Ce framework suit les bonnes pratiques de sécurité Node.js de plusieurs façons :

Chiffrement et hachage

La bonne pratique 6.8 recommande de hacher les données sensibles des utilisateurs (par exemple, les mots de passe) au lieu de les stocker en clair. Elle répertorie trois fonctions à utiliser au minimum et recommande aussi des paramètres de niveau supérieur et des combinaisons propres au programme, afin de limiter les dommages si un acteur malveillant découvre une méthode de hachage. Elle préconise également d’ajouter un sel avant de hacher les mots de passe. NestJS suit cette recommandation en conseillant le chiffrement et le hachage des informations. Pour le chiffrement, ce framework encourage l’utilisation du module crypto intégré. Pour le hachage, il recommande les packages bcrypt ou argon2.

Valider les requêtes entrantes

La bonne pratique 6.10 de Node.js recommande de valider le corps des requêtes entrantes. Il s’agit de définir les charges utiles que l’application doit accepter et de rejeter immédiatement toute charge utile différente. Cela contribue à réduire les attaques DDoS, car un attaquant ne peut pas envoyer de charges utiles personnalisées ayant une structure, une valeur ou une longueur différente. NestJS facilite l’application de cette pratique en fournissant plusieurs pipes prêts à l’emploi, qui permettent d’effectuer la validation.

Modifier les paramètres du middleware de session

La bonne pratique 6.22 de Node.js recommande de modifier les paramètres de cookies par défaut pour mieux protéger les utilisateurs et les applications, en réduisant notamment les attaques par identification ou détournement de session. NestJS facilite l’application de cette pratique en permettant de modifier les paramètres de session. Une vulnérabilité de sécurité ayant touché ce framework se trouvait dans le module @finastra/nestjs-proxy, un module proxy NestJS. Les versions concernées de ce package étaient vulnérables à une divulgation d’informations causée par le transfert par défaut de cookies sensibles.

Fastify

Fastify est un framework web pour Node.js qui vise la rapidité et une faible surcharge. Inspiré de Hapi et Express, il offre une base simple et stable pour créer des applications et des services web. Fastify repose sur une base de code minimale et propose une configuration simple et déclarative, qui permet aux développeurs de lancer rapidement un serveur.

Ce framework suit les bonnes pratiques de sécurité Node.js en recommandant :

L’utilisation de fastify/rate-limit pour limiter les requêtes des clients

Cette recommandation est conforme à la bonne pratique 6.12. Selon cette pratique, la limitation du débit aide à prévenir les attaques par force brute visant l’autorisation sur des routes à privilèges élevés, telles que /login et /admin. Vous pouvez mettre en place cette limitation en créant des limiteurs fondés sur deux critères, comme expliqué ici.

L’utilisation de fastify/helmet pour configurer les principaux en-têtes de sécurité

Cette recommandation est conforme à la bonne pratique 6.6. La configuration d’en-têtes de sécurité adaptés protège votre application contre les scripts intersites, le clickjacking et d’autres attaques.

L’utilisation du plugin fastify-cockroachdb fourni par la communauté

Ce plugin permet aux développeurs de se connecter à une instance PostgreSQL CockroachDB via l’ORM Sequelize. Selon la bonne pratique 6.4, les bibliothèques ORM/DRM contribuent à prévenir les injections SQL/NoSQL en évitant l’utilisation de concaténations de chaînes JavaScript et de chaînes de gabarit, qui exposent toutes deux une application à différents types d’attaques. Cette approche préconise aussi d’utiliser des bibliothèques d’accès aux données réputées, comme Sequelize, Knex et mongoose, car elles offrent une protection intégrée contre les attaques par injection.

Limiter les requêtes simultanées

La bonne pratique 6.2 de Node.js encourage la mise en place d’un limiteur de débit, qui peut aider à éviter un trop grand nombre de requêtes simultanées — à l’origine des attaques par déni de service. Elle recommande d’utiliser un service conçu à cet effet. Fastify propose le plugin @fastify/rate-limit pour vous aider à y parvenir.

Retirer les secrets des fichiers de configuration

La bonne pratique 6.3 de Node.js recommande de stocker les clés et les secrets sous forme chiffrée ou d’utiliser des variables d’environnement. Stockés en clair, ils risquent d’être découverts. Fastify respecte cette recommandation en proposant le plugin @fastify/env, qui permet de vérifier et de charger les fichiers de configuration. Il est néanmoins déconseillé de charger des secrets à partir de variables d’environnement ; cette solution ne doit être utilisée qu’en dernier recours.

L’une des lacunes de sécurité de ce framework est qu’il ne prend pas en charge les listes de révocation de jetons Web JSON (JWT). La révocation des JWT permet d’empêcher un attaquant d’utiliser des jetons expirés ou égarés pour se faire passer pour leur propriétaire.

Un exemple récent de vulnérabilité de sécurité dans ce framework est l’attaque par déni de service qui a touché certaines de ses versions.

Choisir le bon framework

Tous les frameworks web présentés dans cet article respectent les bonnes pratiques de sécurité à un niveau satisfaisant. NestJS est toutefois celui qui se conforme le plus étroitement aux bonnes pratiques de sécurité Node.js : il ajoute une couche d’abstraction au-dessus d’Express.js et intègre des fonctionnalités de sécurité qui compliquent l’accès au système pour les attaquants.

Chacun des frameworks étudiés présente des atouts et des cas d’utilisation adaptés. Ils prennent tous en charge des packages supplémentaires que vous pouvez intégrer pour créer des applications sécurisées et robustes.

Express.js, par exemple, est le framework le plus populaire et le mieux établi. Il bénéficie d’une excellente documentation et d’un large soutien de la communauté.

NestJS est un bon choix pour les applications évolutives, grâce à ses nombreux packages intégrés, à sa couche d’abstraction au-dessus d’Express.js et à sa prise en charge de TypeScript. Enfin, Fastify mise sur des applications web rapides et performantes, sans faire de compromis sur la sécurité.

Quel que soit le framework que vous utilisez, vous devez, en tant que développeur, choisir les dépendances appropriées et respecter les bonnes pratiques de sécurité lors de la création d’une application web. Il est également essentiel de mettre à jour vos packages vers leurs versions les plus récentes afin d’éliminer les vulnérabilités connues.

Lancez-vous dans les compétitions Capture The Flag

Apprenez à résoudre des défis Capture The Flag en regardant à la demande notre atelier virtuel d’initiation.

Publié dans:

Lire la suite

blog feature snyk container custom base recommendations
Blog

Découvrez Evo Agentic AppSec : une sécurité au rythme du développement de l’IA

Le développement piloté par l’IA dépasse les workflows de sécurité traditionnels. L’AppSec agentique de Snyk s’appuie sur des agents de sécurité pour détecter, corriger et vérifier les vulnérabilités en continu, tandis que les équipes définissent les exigences.

feature insights context
Blog

Les attaques autonomes sont déjà là. La défense doit suivre leur rythme.

Les attaquants autonomes réduisent la fenêtre de défense. Découvrez comment la découverte, la correction, la validation et la prévention continues peuvent aider les équipes de sécurité à suivre le rythme.

illustration hero ai
Blog

L’ouragan de l’IA est là

L’IA accélère à la fois la création de logiciels et les cyberattaques. Les dirigeants doivent sécuriser les agents et le code dès leur conception, appliquer des contrôles à l’exécution et valider les défenses de manière indépendante.