Skip to main content

Node.js-Web-Frameworks im Vergleich: Welches ist am sichersten?

Artikel von
prioritize the security backlog

8. März 2023

0 Min. Lesezeit

JavaScript ist die beliebteste Programmiersprache der Welt und bietet zahlreiche Web-Frameworks, mit denen Entwickler sichere und zuverlässige Node.js-Webanwendungen erstellen können. Jedes Framework hat einzigartige Funktionen. Welches das richtige für Sie ist, hängt von Ihren Vorlieben und der Art der Anwendung ab, die Sie entwickeln möchten.

Bei der großen Auswahl an Frameworks brauchen Sie eine Möglichkeit, deren Sicherheit zu bewerten. In diesem Artikel sehen wir uns drei beliebte Frameworks an – Express.js, NestJS und Fastify – und bewerten, wie gut sie den Best Practices für Node.js-Sicherheit entsprechen.

Die Sicherheit von Node.js-Web-Frameworks im Vergleich

Alle JavaScript-basierten Web-Frameworks basieren auf der Node.js-Laufzeitumgebung. Anwendungen im npm-Ökosystem kombinieren in der Regel zahlreiche npm-Abhängigkeiten, um zusätzliche Funktionen bereitzustellen. Daher können Sicherheitslücken in Node.js und den npm-Abhängigkeiten die Anwendung unabhängig vom verwendeten Framework beeinträchtigen. Die Sicherheit unserer Anwendung hängt davon ab, ob wir bei der Entwicklung Best Practices und Designprinzipien befolgen.

Web-Frameworks empfehlen, aktuelle Pakete zu verwenden und sie regelmäßig zu aktualisieren. Sie bieten eine Abstraktionsschicht, die das Risiko eines unbefugten Zugriffs auf die Anwendung verringert. Aus diesen Gründen sollten wir bei der Entwicklung von Anwendungen ein Web-Framework verwenden.

In den folgenden Abschnitten besprechen und vergleichen wir die Sicherheitsfunktionen unserer drei Node.js-Frameworks.

Express.js

Express.js ist ein schnelles, minimalistisches Web-Framework für Node.js, mit dem sich Webanwendungen und APIs auf Basis des MERN- oder MEAN-Stacks erstellen lassen. Das Framework empfiehlt Entwicklern, vor der Bereitstellung ihrer Anwendungen in der Produktionsumgebung zahlreiche Best Practices für Sicherheit einzuhalten. Darüber hinaus orientiert sich Express.js an den Best Practices für Node.js-Sicherheit und gibt zahlreiche Empfehlungen dazu:

Brute-Force-Angriffe verhindern

Die Node.js-Best Practice 6.12 befasst sich mit der Verhinderung von Brute-Force-Angriffen auf Autorisierungsmechanismen. Sie empfiehlt, die Anzahl der Anmeldeversuche auf sensiblen Routen wie /admin oder /login zu begrenzen, um das Risiko von Brute-Force- und Wörterbuchangriffen auf Passwörter zu verringern. Dafür können wir das npm-Paket rate-limiter-flexible verwenden und Anmeldeversuche anhand der Quell-IP-Adresse der Anfrage oder anhand von Parametern im Anfragekörper wie Benutzername oder E-Mail-Adresse begrenzen. Auf Grundlage dieser Eigenschaften können wir einen Limiter erstellen, der aufeinanderfolgende fehlgeschlagene Versuche zählt und begrenzt. Ein weiterer Limiter kann eine IP-Adresse für einen festgelegten Zeitraum sperren, sobald die Höchstzahl aufeinanderfolgender Fehlversuche erreicht ist. Express.js berücksichtigt diese Funktion, indem es die Verwendung desselben npm-Pakets empfiehlt und Autorisierungsversuche anhand derselben Messwerte blockiert.

Regex-Sicherheit gewährleisten

Die Node.js-Best Practice 6.16 empfiehlt Drittanbieterpakete zur Regex-Validierung wie validator.js und safe-regex, um anfällige Muster zu erkennen. Von der Implementierung eigener Regex-Muster wird abgeraten, da schlecht geschriebene reguläre Ausdrücke anfällig für Regex-DoS-Angriffe sind und leicht ausgenutzt werden können, um Ereignisschleifen vollständig zu blockieren.

HTTP-Header korrekt festlegen

Die Best Practice 6.6 empfiehlt die Verwendung sicherer Header, um Anwendungen vor Sicherheitslücken wie Cross-Site-Scripting, Cookie-Hijacking und Clickjacking zu schützen. In der Vergangenheit gab es in Express.js eine Sicherheitslücke im Modul forwarded, das den Header X-Forwarded-For verarbeitet. Um diese Schwachstelle auszunutzen, konnte ein Angreifer eine Abfrage so gestalten, dass sie beim Parsen eine erforderliche Ereignisschleife blockierte und dadurch eine Denial-of-Service-Reaktion auslöste. Um dieser und ähnlichen Sicherheitslücken vorzubeugen, empfiehlt Express.js die Verwendung von Helmet, mit dem sich unsere sicherheitsrelevanten Header einfach festlegen und an die Best Practices für Node.js anpassen lassen.

NestJS

NestJS ist ein Webanwendungs-Framework, das stark vom Frontend-Framework Angular inspiriert ist. NestJS wurde für die Entwicklung skalierbarer Backend-Anwendungen konzipiert. Als Wrapper für Fastify oder Express ist NestJS im Allgemeinen nur so sicher wie diese Frameworks. Der größte Vorteil von NestJS sind die Architektur- und Strukturkonzepte, die wir bei der Entwicklung unserer Anwendung nutzen können.

NestJS basiert auf TypeScript und unterstützt die Sprache. Dadurch können wir besser wartbare und komplexere Anwendungen erstellen. Außerdem bietet es Guards, mit denen sich bestimmen lässt, ob ein Routen-Handler eine bestimmte Anfrage verarbeitet.

Flussdiagramm, das eine HTTP-Anfrage zeigt, die von der Client-Seite über einen Guard zu einem Route-Handler geleitet wird

Dieses Framework setzt die Best Practices für Node.js-Sicherheit auf verschiedene Weise um:

Verschlüsselung und Hashing

Die Best Practice 6.8 empfiehlt, sensible Nutzerdaten (z. B. Passwörter) zu hashen, statt sie im Klartext zu speichern. Sie nennt drei Funktionen, die mindestens verwendet werden sollten, empfiehlt aber auch höhere Parameterwerte und programmspezifische Kombinationen. So lässt sich der Schaden begrenzen, falls ein Angreifer ein Hashverfahren entdeckt. Außerdem wird empfohlen, Passwörter vor dem Hashing mit einem Salt zu versehen. NestJS setzt diese Best Practice um, indem es die Verschlüsselung und das Hashing von Informationen empfiehlt. Für die Verschlüsselung empfiehlt das Framework die Verwendung des integrierten crypto-Moduls. Zum Hashing empfiehlt es die Pakete bcrypt oder argon2.

Eingehende Anfragen validieren

Die Node.js-Best Practice 6.10 empfiehlt, den Anfragekörper eingehender Anfragen zu validieren. Das bedeutet, festzulegen, welche Payloads die Anwendung akzeptieren soll, und die Verarbeitung sofort abzubrechen, wenn eine andere Payload eingeht. So lassen sich DDoS-Angriffe eindämmen, da ein Angreifer keine benutzerdefinierten Payloads mit abweichender Struktur, abweichenden Werten oder abweichender Länge senden kann. NestJS erleichtert die Umsetzung dieser Best Practice mit mehreren integrierten Pipes, die sich zur Validierung verwenden lassen.

Einstellungen der Session-Middleware ändern

Die Node.js-Best Practice 6.22 empfiehlt, die Standardeinstellungen für Cookies anzupassen. Das schützt Nutzer und Anwendungen besser und verringert das Risiko von Angriffen wie Session-Identifizierung und Session-Hijacking. NestJS erleichtert die Umsetzung dieser Best Practice, indem es eine Möglichkeit bietet, Session-Einstellungen zu ändern. Eine Sicherheitslücke, von der dieses Framework betroffen war, befand sich im Modul @finastra/nestjs-proxy, einem NestJS-Proxy-Modul. Betroffene Versionen dieses Pakets waren anfällig für die Offenlegung von Informationen, weil sensible Cookies standardmäßig weitergeleitet wurden.

Fastify

Fastify ist ein Web-Framework für Node.js, das auf hohe Geschwindigkeit und geringen Overhead ausgelegt ist. Es ist von Hapi und Express inspiriert und bietet eine einfache, stabile Grundlage für die Entwicklung von Webanwendungen und -diensten. Fastify verwendet eine minimale Codebasis und eine einfache, deklarative Konfiguration, mit der Entwickler schnell einen Server starten können.

Dieses Framework orientiert sich an den Best Practices für Node.js-Sicherheit, indem es Folgendes empfiehlt:

Die Verwendung von fastify/rate-limit zur Begrenzung von Client-Anfragen

Dies entspricht der Best Practice 6.12. Demnach hilft eine Begrenzung der Anfragerate, Brute-Force-Angriffe auf Autorisierungsmechanismen privilegierter Routen wie /login und /admin zu verhindern. Wie hier beschrieben, lässt sich die Anfragerate anhand von zwei Messwerten begrenzen.

Die Verwendung von fastify/helmet zum Festlegen wichtiger Sicherheitsheader

Dies entspricht der Best Practice 6.6. Geeignete Sicherheitsheader schützen Ihre Anwendung vor Cross-Site-Scripting, Clickjacking und anderen Angriffen.

Die Verwendung des von der Community bereitgestellten Plugins fastify-cockroachdb

Dieses Plugin ermöglicht es Entwicklern, über das Sequelize-ORM eine CockroachDB-PostgreSQL-Instanz anzubinden. Gemäß der Best Practice 6.4 helfen ORM-/DRM-Bibliotheken, SQL-/NoSQL-Injection-Angriffe zu verhindern. Dazu vermeiden sie die Verkettung von JavaScript-Strings und Template-Strings, die Anwendungen verschiedenen Angriffen aussetzen können. Dieser Ansatz unterstützt auch die Verwendung renommierter Datenzugriffsbibliotheken wie Sequelize, Knex und mongoose, die integrierten Schutz vor Injection-Angriffen bieten.

Gleichzeitige Anfragen begrenzen

Die Node.js-Best Practice 6.2 empfiehlt die Implementierung eines Rate-Limiters, der eine zu große Anzahl gleichzeitiger Anfragen verhindern kann – die Grundlage von DoS-Angriffen. Dafür sollte ein eigens für diesen Zweck entwickelter Dienst verwendet werden. Fastify bietet dazu das Plugin @fastify/rate-limit.

Secrets aus Konfigurationsdateien entfernen

Die Node.js-Best Practice 6.3 empfiehlt, Schlüssel und Secrets verschlüsselt oder als Umgebungsvariablen zu speichern. Im Klartext gespeicherte Werte können leicht entdeckt werden. Fastify setzt diese Best Practice mit dem Plugin @fastify/env um, mit dem sich Konfigurationsdateien überprüfen und laden lassen. Secrets aus Umgebungsvariablen zu laden, sollte jedoch vermieden werden und nur der letzte Ausweg sein.

Ein Sicherheitsmanko dieses Frameworks ist die fehlende Unterstützung für Sperrlisten für JSON Web Tokens (JWTs). Mit solchen Sperrlisten lässt sich verhindern, dass Angreifer abgelaufene oder verlegte Tokens verwenden, um sich als deren Besitzer auszugeben.

Ein aktuelles Beispiel für eine Sicherheitslücke in diesem Framework ist der DoS-Angriff, von dem einige Framework-Versionen betroffen waren.

Das richtige Framework auswählen

Alle in diesem Artikel besprochenen Web-Frameworks halten die Best Practices für Sicherheit in ausreichendem Maß ein. NestJS orientiert sich jedoch am stärksten an den Best Practices für Node.js-Sicherheit. Es bietet eine Abstraktionsschicht über Express.js mit integrierten Sicherheitsfunktionen, die Angreifern den Zugriff auf das System erschweren.

Jedes der untersuchten Frameworks hat eigene Stärken und eignet sich für bestimmte Einsatzbereiche. Außerdem unterstützen alle Frameworks zusätzliche Pakete, die Sie integrieren können, um sichere und robuste Anwendungen zu entwickeln.

Express.js ist beispielsweise das bekannteste und etablierteste Framework. Es bietet eine ausgezeichnete Dokumentation und wird von einer großen Community unterstützt.

NestJS eignet sich gut für skalierbare Anwendungen, da es viele integrierte Pakete bietet, Express.js abstrahiert und TypeScript unterstützt. Fastify wiederum legt den Fokus auf schnelle, effiziente Webanwendungen, ohne Abstriche bei der Sicherheit zu machen.

Unabhängig davon, welches Framework Sie verwenden: Als Entwickler müssen Sie die passenden Abhängigkeiten auswählen und bei der Entwicklung von Webanwendungen die Best Practices für Sicherheit einhalten. Außerdem ist es entscheidend, Pakete stets auf die neuesten Versionen zu aktualisieren, um bekannte Sicherheitslücken zu schließen.

Starten Sie mit Capture the Flag

Erfahren Sie in unserem virtuellen On-Demand-Workshop für Einsteiger, wie Sie Capture-the-Flag-Herausforderungen lösen.

Gepostet in:

Weiterlesen

blog feature snyk container custom base recommendations
Blog

Evo Agentic AppSec: Sicherheit, die mit der KI-Entwicklung Schritt hält

KI-gestützte Entwicklung überholt herkömmliche Security-Workflows. Snyk Agentic AppSec setzt Security-Agenten ein, die Schwachstellen kontinuierlich finden, beheben und überprüfen – während Menschen die Maßstäbe festlegen.

feature insights context
Blog

Autonome Angriffe sind bereits Realität. Die Verteidigung muss Schritt halten.

Autonome Angreifer verkürzen das Zeitfenster für die Verteidigung. Erfahren Sie, wie kontinuierliches Erkennen, Beheben, Validieren und Verhindern Sicherheitsteams helfen kann, Schritt zu halten.

illustration hero ai
Blog

Der KI-Hurrikan ist da

KI beschleunigt gleichermaßen die Softwareentwicklung und Cyberangriffe. Führungskräfte müssen Agents und Code von Anfang an absichern, zur Laufzeit Kontrollen durchsetzen und Abwehrmaßnahmen unabhängig validieren.