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 <[email protected]>
This commit is contained in:
2026-08-26 14:41:27 +02:00
co-authored by Claude Opus 5
parent b2f4567cce
commit c591925342
+23 -7
View File
@@ -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);