From c5919253423d84b54d2fe78681149ec7a7b31197 Mon Sep 17 00:00:00 2001 From: Dogfather Date: Wed, 26 Aug 2026 14:41:27 +0200 Subject: [PATCH] DRINGEND: Inhaltsrichtlinie legte die App lahm Symptom: Die installierte App zeigte "Keine Verbindung", obwohl die Seite online war, der Server lief und jede Pruefung Erfolg meldete. Ursache war meine eigene Zeile von heute Vormittag. Fuer alles, was keine Seite ist, setzte die Middleware "default-src 'none'" -- mit dem Gedanken "kostet nichts und schadet nie". Der zweite Halbsatz war falsch. Ein Service Worker uebernimmt die Inhaltsrichtlinie, die beim Herunterladen SEINER EIGENEN Skriptdatei gesetzt war, nicht die der Seite, fuer die er arbeitet. sw.js ist keine Seite, bekam also 'none' und durfte damit nichts mehr abrufen. Jede Anfrage scheiterte -- und weil der Service Worker fuer genau diesen Fall eine Offline-Seite bereithaelt, sah es aus wie ein Netzausfall beim Benutzer. Fuer Bilder, Stylesheets und Schriften bringt eine Richtlinie ohnehin nichts: Sie steuert, was ein DOKUMENT nachladen darf. Ein Bild laedt nichts nach. Dem Schaden stand also nie ein Gewinn gegenueber. Jetzt: Richtlinie nur noch fuer HTML-Dokumente. Warum der Test das nicht gefunden hat, folgt gleich -- er hat die Seiten geladen, aber nie den Service Worker arbeiten lassen. Genau die Luecke, durch die es durchgerutscht ist. Co-Authored-By: Claude Opus 5 --- server/inhaltsrichtlinie.js | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/server/inhaltsrichtlinie.js b/server/inhaltsrichtlinie.js index 6638afdb..69f60230 100644 --- a/server/inhaltsrichtlinie.js +++ b/server/inhaltsrichtlinie.js @@ -117,13 +117,29 @@ export function inhaltsrichtlinie(wurzel) { return function (req, res, next) { const datei = dateiZuPfad(wurzel, req.path === "/" ? "/index.html" : req.path); - /* Für alles, was keine Seite ist (Bilder, CSS, Schriften, API), - genügt eine knappe Regel. Sie kostet nichts und schadet nie. */ - if (!datei) { - res.setHeader("Content-Security-Policy", - "default-src 'none'; frame-ancestors 'self'; base-uri 'none'"); - return next(); - } + /* ⚠️ HIER STAND EINE REGEL FÜR NICHT-SEITEN. SIE HAT DIE APP + LAHMGELEGT (26.08.2026, sofort behoben). + + Der Gedanke war: "default-src 'none' für alles, was keine Seite + ist — kostet nichts und schadet nie." Der zweite Halbsatz war + falsch, und zwar an einer Stelle, die man nicht auf dem Schirm + hat: + + Ein Service Worker übernimmt die Inhaltsrichtlinie, die beim + Herunterladen SEINER EIGENEN Skriptdatei gesetzt war — nicht die + der Seite, für die er arbeitet. Mit 'none' darf er nichts mehr + abrufen. Jede Anfrage scheitert, und weil er für genau diesen + Fall eine Offline-Seite anzeigt, sah es für den Benutzer aus wie + ein Netzausfall. Die Seite war online, der Server lief, alles + meldete Erfolg — und die App zeigte "Keine Verbindung". + + Für Bilder, Stylesheets und Schriften bringt eine Richtlinie + ohnehin nichts: Sie steuert, was ein DOKUMENT laden darf. Ein + Bild lädt nichts nach. Es gab also nie einen Gewinn, dem der + Schaden gegenüberstand. + + Deshalb: Richtlinie NUR für HTML-Dokumente. */ + if (!datei) return next(); const summen = summenFuer(datei);