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:
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user