Zurück zu allen Artikeln
Best Practice DevOps Node.js Security Software Development

Schützen Sie Ihre Anwendung: Implementierung von Rate Limiting für Login-Formulare mit Express.js und Nginx

Einleitung

Die Sicherheit von Webanwendungen ist von größter Bedeutung, insbesondere bei der Verarbeitung sensibler Daten wie Benutzernamen und Passwörtern. Eine der effektivsten Methoden zur Verhinderung von Brute-Force-Angriffen und Überlastungen ist das Rate Limiting. In diesem Artikel erfahren Sie, wie Sie Rate Limiting für ein typisches Login-Formular mithilfe von Express.js und Nginx implementieren können.

Was ist Rate Limiting?

Rate Limiting ist eine Technik, die die Anzahl der Anfragen an einen Server innerhalb eines bestimmten Zeitraums begrenzt. Dies schützt Ihre Anwendung vor Missbrauch und Überlastung, indem es die Anzahl der zulässigen Anfragen pro Benutzer oder IP-Adresse einschränkt. Für Login-Formulare ist dies besonders wichtig, um Brute-Force-Angriffe zu verhindern, bei denen ein Angreifer versucht, durch wiederholtes Ausprobieren von Passwörtern Zugang zu erhalten.

Implementierung von Rate Limiting mit Express.js

Express.js ist ein beliebtes Web-Framework für Node.js, das sich hervorragend für die Implementierung von Rate Limiting eignet. Wir verwenden das express-rate-limit-Paket, um die Rate Limiting-Funktionalität hinzuzufügen.

Projekt einrichten

Erstellen Sie zunächst ein neues Node.js-Projekt und installieren Sie die erforderlichen Abhängigkeiten:

mkdir rate-limiting-auth
cd rate-limiting-auth
npm init -y
npm install express express-rate-limit

Erstellen des Express-Servers mit Rate Limiting

Erstellen Sie einen grundlegenden Express-Server in server.js und konfigurieren Sie das Rate Limiting für die Login-Routen:

const express = require('express')
const rateLimit = require('express-rate-limit')

const app = express()
app.use(express.json())

// Konfigurieren des Rate Limiting für die Login-Routen
const loginLimiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15 Minuten
  max: 5, // Limit auf 5 Anfragen pro 15 Minuten pro IP
  message:
    'Zu viele Login-Versuche von dieser IP, bitte versuchen Sie es später erneut.',
})

app.post('/login', loginLimiter, (req, res) => {
  const { username, password } = req.body

  // Hier würde die Login-Logik implementiert werden
  res.send('Login-Anfrage erhalten')
})

app.listen(3000, () => {
  console.log('Server läuft auf Port 3000')
})

Implementierung von Rate Limiting mit Nginx

Nginx ist ein leistungsstarker Webserver, der auch als Reverse Proxy verwendet werden kann. Er bietet eingebaute Funktionen für das Rate Limiting, die sich ideal zur Ergänzung Ihrer Express.js-Anwendung eignen.

Nginx-Konfiguration für Rate Limiting

Bearbeiten Sie die Nginx-Konfigurationsdatei (normalerweise unter /etc/nginx/nginx.conf oder /etc/nginx/sites-available/default):

http {
    # Konfiguration des Rate Limiting
    limit_req_zone $binary_remote_addr zone=login_zone:10m rate=10r/m;

    server {
        listen 80;

        location /login {
            # Anwenden des Rate Limiting auf die Login-Route
            limit_req zone=login_zone burst=5 nodelay;

            proxy_pass http://localhost:3000;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
}

In diesem Beispiel begrenzen wir die Login-Anfragen auf 10 Anfragen pro Minute und verwenden eine Zone namens login_zone, die bis zu 5 gleichzeitige Anfragen zulässt. Anfragen, die das Limit überschreiten, werden abgelehnt.

Fazit

Die Implementierung von Rate Limiting ist ein entscheidender Schritt zur Sicherung Ihrer Webanwendung gegen Brute-Force-Angriffe und Überlastungen. Durch die Kombination von Express.js und Nginx können Sie eine robuste und skalierbare Lösung erstellen, die Ihre Login-Formulare schützt. Mit den oben beschriebenen Methoden können Sie sicherstellen, dass Ihre Anwendung nicht nur sicher, sondern auch leistungsfähig bleibt.