In modernen Webanwendungen sind API-Endpunkte die Tore des Systems zur Außenwelt. Wenn Sie diese Tore nicht ausreichend sichern, sind Lecks, unbefugter Zugriff und schwerwiegende Datenschutzverletzungen unvermeidlich. Eine der effektivsten Methoden zur Gewährleistung der Sicherheit in APIs ist die Verwendung von Middleware.
In diesem Artikel werden wir, beginnend mit der Frage "Was ist Middleware?", anhand von Beispielcode und Szenarien erläutern, wie wir die Sicherheit von API-Endpunkten mithilfe von Middleware gewährleisten können.
Was ist Middleware?
Middleware sind Zwischensoftware-Schichten, die ausgeführt werden, bevor eine API-Anfrage den Server erreicht oder bevor eine Antwort generiert wird. Ihre Funktionen können sein:
-
Authentifizierung der eingehenden Anfrage
-
Überprüfung der Benutzerberechtigung
-
Datenvalidierung (Input Validation)
-
Anfrageprotokollierung (Logging)
-
Geschwindigkeitsbegrenzung (Rate Limiting)
Dank Middleware wird die API-Struktur durch die Reduzierung von Code-Wiederholungen sicherer, lesbarer und wartungsfreundlicher.
Was passiert, wenn keine Middleware verwendet wird?
-
Das Risiko eines unbefugten Zugriffs steigt.
-
Es entstehen Mängel bei der Authentifizierung.
-
Es besteht die Möglichkeit, zu viele Daten preiszugeben.
-
Wenn es kein Rate Limit gibt, werden Sie anfällig für Angriffe wie DDoS.
Ein einfaches Beispiel: Wenn Sie einen Endpunkt wie /api/user/delete/:id
haben und die gesendete ID nicht überprüfen, kann jeder Benutzer die Konten anderer Benutzer löschen.
Grundlegende Middleware-Typen, die in API-Endpunkten verwendet werden sollten
1. Authentifizierungs-Middleware (Authentication Middleware)
Überprüft, ob sich der Benutzer im System angemeldet hat.
Beispiel (Node.js / Express.js):
function authMiddleware(req, res, next) {
const token = req.headers['authorization'];
if (!token) {
return res.status(401).json({ message: 'Token nicht gefunden!' });
}
try {
const decoded = jwt.verify(token, process.env.JWT_SECRET);
req.user = decoded;
next();
} catch (error) {
return res.status(403).json({ message: 'Ungültiges Token!' });
}
}
Verwendung:
app.get('/api/profile', authMiddleware, (req, res) => {
res.json({ user: req.user });
});
2. Autorisierungs-Middleware (Authorization Middleware)
Überprüft, ob der authentifizierte Benutzer berechtigt ist, bestimmte Aktionen auszuführen.
Beispiel:
function adminMiddleware(req, res, next) {
if (req.user.role !== 'admin') {
return res.status(403).json({ message: 'Unbefugter Zugriff!' });
}
next();
}
Verwendung:
app.delete('/api/user/:id', authMiddleware, adminMiddleware, (req, res) => {
// Benutzerlöschvorgänge
});
3. Eingabevalidierungs-Middleware (Input Validation Middleware)
Überprüft das Format und den Inhalt der an den Server gesendeten Daten. Bietet Schutz vor Gefahren wie SQL Injection und XSS.
Beispiel (mit der Joi-Bibliothek):
const Joi = require('joi');
function validateUserInput(req, res, next) {
const schema = Joi.object({
email: Joi.string().email().required(),
password: Joi.string().min(6).required()
});
const { error } = schema.validate(req.body);
if (error) {
return res.status(400).json({ message: error.details[0].message });
}
next();
}
Verwendung:
app.post('/api/register', validateUserInput, (req, res) => {
// Registrierungsvorgänge
});
4. Rate Limiting Middleware (Geschwindigkeitsbegrenzung)
Begrenzt die Anzahl der Anfragen, die eine IP-Adresse innerhalb eines bestimmten Zeitraums stellen kann. Verhindert DDoS- oder Brute-Force-Angriffe.
Beispiel (mit Express-rate-limit):
const rateLimit = require('express-rate-limit');
const limiter = rateLimit({
windowMs: 15 * 60 * 1000,
max: 100
});
app.use(limiter);
5. CORS Middleware
Stellt sicher, dass Anfragen nur von bestimmten Domains kommen.
Beispiel:
const cors = require('cors');
app.use(cors({
origin: 'https://siteniz.com'
}));
Beispiel für ein reales Szenario: Verletzung ohne Middleware
Auf einer Blog-Website wurde der Endpunkt /api/admin/posts/delete/:postId
ohne Middleware veröffentlicht. Ein angreifender Benutzer konnte die Beiträge anderer Benutzer löschen, indem er postId
's verwendete, die ihm nicht gehörten.
Wenn authMiddleware
+ adminMiddleware
verwendet worden wäre:
-
Die Authentifizierung wäre durchgeführt worden.
-
Nur Benutzer mit Administratorrechten hätten Aktionen ausführen können.
-
Der Versuch einer unbefugten Operation wäre verhindert worden.
Fazit: Middleware ist die erste Verteidigungslinie
Schützen Sie Ihre API-Endpunkte immer mit Authentifizierungs-, Autorisierungs-, Validierungs- und Begrenzungs-Schichten. Denken Sie daran, dass die beste Verteidigung damit beginnt, die eingehende Anfrage bereits beim ersten Kontakt zu hinterfragen.
Mit den Beispielen in diesem Artikel können Sie ganz einfach eine Middleware-Architektur in Ihr eigenes System integrieren und Ihre APIs viel widerstandsfähiger und professioneller gestalten.