Reporting API für Express.js konfigurieren

Report-To, NEL und Reporting-Endpoints in Express.js einrichten — per Middleware für Header, express.json() für Report-Empfang und CORS-Konfiguration für Cross-Origin-Reports.

Express.js · Schritt für Schritt

Reporting API auf Express.js

Express.js ist der ideale Stack für die Reporting API: Eine Middleware setzt die Header für alle Responses, und express.json() parsed eingehende Reports automatisch. Der Vorteil gegenüber statischen Webservern: Sie können Report-To JSON-Objekte sicher mit JSON.stringify() erzeugen, CORS-Header dynamisch setzen und Reports direkt in Ihrer Anwendung verarbeiten. Reporting API bringt 4 von 166 Punkten im Wolf-Agents Web Security Check.

1 Schritt 1 von 2

Reporting-Header per Middleware setzen

Erstellen Sie eine Middleware, die Report-To, NEL und Reporting-Endpoints für alle Responses setzt. Nutzen Sie JSON.stringify() für korrekt formatiertes JSON — Report-To erwartet komma-separierte JSON-Objekte, kein JSON-Array.

app.js Middleware
// Reporting Headers Middleware
app.use((req, res, next) => {
  // Report-To: komma-separierte JSON-Objekte (KEIN JSON-Array!)
  const groups = [
    {
      group: 'nel',
      max_age: 31536000,
      endpoints: [{ url: 'https://reports.example.com/nel' }]
    },
    {
      group: 'default',
      max_age: 31536000,
      endpoints: [{ url: 'https://reports.example.com/default' }]
    }
  ];
  const reportTo = groups.map(g => JSON.stringify(g)).join(', ');
  res.setHeader('Report-To', reportTo);

  // NEL
  const nel = JSON.stringify({
    report_to: 'nel',
    max_age: 31536000,
    include_subdomains: true,
    failure_fraction: 1.0,
    success_fraction: 0.01
  });
  res.setHeader('NEL', nel);

  // Reporting-Endpoints
  res.setHeader('Reporting-Endpoints',
    'default="https://reports.example.com/default", csp="https://reports.example.com/csp"'
  );

  next();
});
2 Schritt 2 von 2

Report-Endpoint mit CORS implementieren

Browser senden Reports Cross-Origin — auch wenn der Endpoint auf derselben Domain liegt. Ohne CORS-Header lehnt der Browser die Zustellung ab. Konfigurieren Sie express.json() mit dem korrekten Content-Type für Browser-Reports.

app.js Endpoint
// CORS-Middleware für Report-Endpoints
const reportCors = (req, res, next) => {
  res.set('Access-Control-Allow-Origin', '*');
  res.set('Access-Control-Allow-Methods', 'POST');
  res.set('Access-Control-Allow-Headers', 'Content-Type');
  if (req.method === 'OPTIONS') return res.status(204).end();
  next();
};

// NEL-Report-Endpoint
app.post('/reports/nel', reportCors, express.json({ type: 'application/reports+json' }), (req, res) => {
  console.log('NEL Report:', JSON.stringify(req.body, null, 2));
  // Reports verarbeiten/speichern
  res.status(204).end();
});

// CSP-Report-Endpoint
app.post('/reports/csp', reportCors, express.json({ type: 'application/csp-report' }), (req, res) => {
  console.log('CSP Report:', JSON.stringify(req.body, null, 2));
  res.status(204).end();
});
In Produktion: Implementieren Sie Rate-Limiting für den Report-Endpoint (z.B. 100 Reports/Minute/IP) und speichern Sie Reports in einer Queue statt sie synchron zu verarbeiten. Der Endpoint sollte immer sofort mit Status 204 antworten.

Wie steht Ihre Domain bei Reporting API?

Prüfen Sie es jetzt — kostenlos, ohne Registrierung, mit 166 Prüfpunkte.

Häufig gestellte Fragen

Warum brauche ich CORS für den Report-Endpoint?

Browser senden Reporting-API-Reports Cross-Origin — auch wenn der Endpoint auf derselben Domain liegt. Ohne Access-Control-Allow-Origin Header lehnt der Browser die Zustellung ab und die Reports gehen verloren. Setzen Sie mindestens Access-Control-Allow-Origin: * und Access-Control-Allow-Methods: POST.

Welchen Content-Type haben Browser-Reports?

Browser senden NEL- und Reporting-API-Reports als application/reports+json. CSP-Reports verwenden application/csp-report. Konfigurieren Sie express.json() mit dem type-Parameter für beide Content-Types.

Kann ich Report-To JSON als String zusammenbauen?

Nein, vermeiden Sie manuell zusammengebaute JSON-Strings. Nutzen Sie JSON.stringify() mit JavaScript-Objekten — das verhindert Escaping-Fehler. Report-To erwartet komma-separierte JSON-Objekte, kein JSON-Array.

Welche Browser unterstützen Report-To und NEL?

Report-To, NEL und Reporting-Endpoints werden ausschließlich von Chromium-basierten Browsern unterstützt — Chrome 70+, Edge 79+ und Opera. Firefox und Safari implementieren keinen dieser Header.

Soll ich Reports synchron oder asynchron verarbeiten?

Asynchron. In Produktion können tausende Reports pro Minute eingehen. Speichern Sie Reports in einer Queue (z.B. BullMQ, Redis) und verarbeiten Sie sie im Hintergrund. Der Report-Endpoint sollte sofort mit Status 204 antworten.