X-Content-Type-Options für Express.js konfigurieren
Schritt-für-Schritt-Anleitung: nosniff via helmet.noSniff() oder manueller Middleware setzen und Content-Types in allen Routen korrekt deklarieren.
X-Content-Type-Options in Express.js
Express.js setzt von sich aus keine Security-Header — das ist bewusst, da Express ein minimales Framework ist. Das helmet-Paket ist der De-facto-Standard für Express-Security-Header: app.use(helmet()) setzt mit einer Zeile alle 14 empfohlenen Security-Header, inklusive X-Content-Type-Options: nosniff.
X-Content-Type-Options bringt 10 von 166 Punkten im Wolf-Agents Web Security Check. Alternativ können Sie den Header ohne externe Abhängigkeit manuell in einer Middleware setzen. Diese Anleitung zeigt beide Wege plus die korrekte Content-Type-Deklaration in Routen.
helmet.noSniff()
Das helmet-Paket ist die empfohlene Lösung für Express-Security-Header. app.use(helmet()) aktiviert alle Standard-Security-Header in einer Zeile. Wenn Sie nur den nosniff-Header brauchen, verwenden Sie helmet.noSniff() allein.
// npm install helmet
const express = require('express');
const helmet = require('helmet');
const app = express();
// Option A: Alle Security-Header (empfohlen)
app.use(helmet());
// Option B: Nur noSniff
app.use(helmet.noSniff());
// Ihre Routen nach den Security-Middleware
app.get('/', (req, res) => {
res.send('Hello World');
});
app.listen(3000); app.use(helmet()) muss vor allen Routen und anderen Middlewares stehen — idealerweise als erste Zeile nach const app = express().
npm install helmet && node server.js Manuelle Middleware
Wenn Sie keine externe Abhängigkeit wollen oder ein bestehendes Middleware-Setup haben, können Sie den Header direkt in einer app.use()-Funktion setzen. Das ist funktional identisch zu helmet.noSniff(), aber ohne package-Abhängigkeit.
// Manuelle Middleware — ohne externe Abhängigkeit
const express = require('express');
const app = express();
// Security-Header Middleware
app.use((req, res, next) => {
// MIME-Sniffing verhindern
res.setHeader('X-Content-Type-Options', 'nosniff');
// Weitere empfohlene Header
res.setHeader('X-Frame-Options', 'SAMEORIGIN');
res.setHeader('Referrer-Policy', 'strict-origin-when-cross-origin');
next();
}); next() am Ende der Middleware-Funktion — ohne next() werden nachfolgende Middleware und Routen nie aufgerufen und alle Anfragen bleiben ohne Antwort. Content-Type korrekt setzen
nosniff macht nur dann Sinn, wenn alle Ressourcen mit korrekten Content-Types ausgeliefert werden. Verwenden Sie res.type() oder res.setHeader("Content-Type", ...) für explizite Typ-Deklarationen. res.json() setzt application/json automatisch.
// Korrekte Content-Types in Express-Routen
// JSON-API-Route — res.json() setzt Content-Type automatisch
app.get('/api/data', (req, res) => {
res.json({ data: '...' });
// Content-Type: application/json (automatisch)
});
// JavaScript-Datei korrekt ausliefern
app.get('/scripts/app.js', (req, res) => {
res.type('text/javascript'); // RFC 9239
res.sendFile(path.join(__dirname, 'public/app.js'));
});
// express.static() mit korrekten MIME-Typen
app.use('/static', express.static('public', {
setHeaders: (res, filePath) => {
// Zusätzliche Header für statische Dateien
res.setHeader('X-Content-Type-Options', 'nosniff');
}
})); application/octet-stream ausliefern und nosniff aktivieren, blockiert der Browser Ihre eigenen Scripts. Prüfen Sie alle Routen, die Datei-Inhalte zurückgeben, auf korrekte Content-Type-Deklaration. Verifizierung
Testen Sie den Header für verschiedene Endpunkte — HTML-Seiten, JSON-APIs und statische Dateien. Starten Sie den Server lokal und prüfen Sie mit curl oder den Browser DevTools.
# Server starten
node server.js
# Header prüfen
curl -sI http://localhost:3000 | grep -i x-content-type
# API-Route prüfen
curl -sI http://localhost:3000/api/data | grep -i "x-content-type|content-type"
# Erwartete Ausgaben:
# x-content-type-options: nosniff
# content-type: application/json; charset=utf-8 Wenn Express hinter einem Reverse Proxy läuft, können sowohl Express als auch der Proxy den Header setzen. Das ist unproblematisch — beide Werte werden als ein Header zusammengeführt, solange der Wert identisch ist.
Wie steht Ihre Domain bei X-Content-Type-Options?
Prüfen Sie es jetzt — kostenlos, ohne Registrierung, mit 166 Prüfpunkte.
Häufig gestellte Fragen
Was ist helmet und warum sollte ich es für Express verwenden?
helmet ist eine Express-Middleware-Sammlung, die 14 Security-HTTP-Header mit einer einzigen Zeile konfiguriert. Dazu gehören X-Content-Type-Options: nosniff, X-Frame-Options, Strict-Transport-Security und weitere. Die Alternative — jeden Header manuell zu setzen — ist fehleranfälliger und aufwändiger. helmet wird von Millionen Express-Projekten genutzt und aktiv gepflegt.
Muss ich helmet() oder nur helmet.noSniff() aufrufen?
Für maximale Sicherheit verwenden Sie das vollständige helmet() — es setzt alle empfohlenen Security-Header automatisch. helmet.noSniff() allein ist die minimale Option, die nur X-Content-Type-Options setzt. Wenn Sie andere helmet-Funktionen nicht wollen, verwenden Sie die manuelle Middleware-Variante.
Wo in der Middleware-Chain muss helmet stehen?
helmet sollte so früh wie möglich in der Middleware-Chain stehen — idealerweise als erste Middleware nach dem App-Setup, vor Routing, Authentifizierung und Body-Parsing. Das stellt sicher, dass Security-Header bei jeder Antwort gesetzt werden, auch wenn spätere Middleware Fehler wirft.
Wie setze ich korrekte Content-Types in Express-Antworten?
Verwenden Sie res.type() für gängige Typen (res.type("json"), res.type("html")) oder res.setHeader("Content-Type", "text/javascript") für spezifische Werte. res.json() setzt automatisch application/json. Für statische Dateien via express.static() werden MIME-Typen aus der mime-Datenbank ermittelt.
Funktioniert helmet auch mit Express 5?
Ja. helmet ist kompatibel mit Express 4 und Express 5. Die API ist identisch — app.use(helmet()) funktioniert in beiden Versionen. Prüfen Sie die aktuelle helmet-Version in package.json für Kompatibilitätsdetails.