security.txt für Express.js einrichten
security.txt in Express.js bereitstellen: Express-Route oder express.static für statische Auslieferung, dynamische Generierung mit req.hostname möglich.
security.txt auf Express.js
Express.js bietet zwei elegante Ansätze für die security.txt nach RFC 9116: Eine statische Route mit res.sendFile() liefert die Datei aus dem Dateisystem aus, die dynamische Variante generiert den Inhalt pro Request — inklusive automatischem Expires-Datum über Date.now(). Beide Varianten benötigen weniger als 10 Zeilen Code.
security.txt bringt 2 von 166 Punkten im Wolf-Agents Web Security Check. Die dynamische Variante berechnet das Expires-Datum automatisch und leitet den Hostnamen aus dem Request ab — ideal für Multi-Domain-Setups.
Statische Route mit res.sendFile
Erstellen Sie die security.txt unter public/.well-known/security.txt und fügen Sie eine Express-Route hinzu, die die Datei mit dem korrekten Content-Type ausliefert.
Contact: mailto:security@ihre-domain.de
Expires: 2027-01-31T23:59:59.000Z
Preferred-Languages: de, en
Canonical: https://ihre-domain.de/.well-known/security.txt const path = require('path');
// security.txt als statische Datei bereitstellen
app.get('/.well-known/security.txt', (req, res) => {
res.type('text/plain');
res.sendFile(path.join(__dirname, 'public', '.well-known', 'security.txt'));
}); Dynamische Generierung
Die dynamische Variante generiert die security.txt per res.send und berechnet das Expires-Datum automatisch als ein Jahr ab dem aktuellen Zeitpunkt. Der Hostname wird aus req.hostname abgeleitet — ideal für Multi-Domain-Setups.
// security.txt dynamisch generieren
app.get('/.well-known/security.txt', (req, res) => {
res.type('text/plain');
res.send(`Contact: mailto:security@${req.hostname}
Expires: ${new Date(Date.now() + 365 * 24 * 60 * 60 * 1000).toISOString()}
Preferred-Languages: de, en
`);
}); Stellen Sie sicher, dass req.hostname nur vertrauenswürdige Werte liefert. Konfigurieren Sie app.set('trust proxy', true) hinter einem Reverse Proxy und validieren Sie den Hostname gegen eine Whitelist.
Ergebnis verifizieren
# Header prüfen
curl -I http://localhost:3000/.well-known/security.txt
# Inhalt anzeigen
curl http://localhost:3000/.well-known/security.txt Wie steht Ihre Domain bei security.txt?
Prüfen Sie es jetzt — kostenlos, ohne Registrierung, mit 166 Prüfpunkte.
Häufig gestellte Fragen
Statisch oder dynamisch — was ist besser?
Die statische Variante ist einfacher und die Datei kann unabhängig vom Code gepflegt werden. Die dynamische Variante ist nützlich, wenn Sie das Expires-Datum automatisch berechnen oder den Hostname aus dem Request ableiten möchten.
Muss ich express.static für .well-known konfigurieren?
Nicht zwingend. Eine explizite Route mit app.get ist meist übersichtlicher als express.static für einen einzelnen Pfad. Wenn Sie express.static bereits für public/ konfiguriert haben, wird die Datei dort allerdings automatisch ausgeliefert.
Funktioniert das auch mit ES Modules (import statt require)?
Ja. Ersetzen Sie require("path") durch import path from "path" und verwenden Sie import.meta.url mit fileURLToPath für __dirname in ES Modules.