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.

Express.js · Schritt für Schritt

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.

1 Schritt 1 von 4

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.

server.js / app.js helmet
// 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);
Position in der Middleware-Chain

app.use(helmet()) muss vor allen Routen und anderen Middlewares stehen — idealerweise als erste Zeile nach const app = express().

Installieren und starten:
npm install helmet && node server.js
2 Schritt 2 von 4

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.

server.js Manuelle Middleware
// 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();
});
Denken Sie an next() am Ende der Middleware-Funktion — ohne next() werden nachfolgende Middleware und Routen nie aufgerufen und alle Anfragen bleiben ohne Antwort.
3 Schritt 3 von 4

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.

routes.js Content-Types
// 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');
  }
}));
Wenn Sie JavaScript-Dateien als 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.
4 Schritt 4 von 4

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.

Terminal Verifizierung
# 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
Hinter einem Reverse Proxy (Nginx/Apache)

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.