fix: Typisierung von oeffnen(), CSP im Entwicklungsmodus, Nonce-Abweichung
Drei Fehler, die sich beim Durchsehen der Typpruefung und der
Browserkonsole gezeigt haben.
1. oeffnen() lieferte Record<string, string | null>. Zusammen mit
noUncheckedIndexedAccess wurde daraus bei jedem Zugriff
string | null | undefined - und jede aufrufende Seite haette das
wegkaesen muessen, obwohl die Felder immer da sind. Jetzt leitet ein
Mapped Type die Klartextnamen aus VERSCHLUESSELTE_FELDER ab:
oeffnen('Betreute', zeile).diagnosen ist sauber string | null.
Das hat auf einen Schlag 17 Folgefehler in fremden Modulen erledigt.
2. Die CSP blockierte im Entwicklungsmodus die eigenen Skripte.
'strict-dynamic' schaltet die Freigabe nach Herkunft ab, also auch
'self' - und Hot-Reload und Fehleranzeige laden ohne Nonce. Man sah
eine tote Seite statt der Fehlermeldung. Im Produktivbetrieb bleibt
es bei Nonce plus 'strict-dynamic', im Entwicklungsmodus gilt die
lockere Fassung.
3. Das Theme-Skript im Layout meldete bei jedem Seitenaufruf eine
Hydrations-Abweichung: React gibt das nonce-Attribut absichtlich
nicht an den Browser weiter, serverseitig steht es aber im HTML.
suppressHydrationWarning am Skript selbst - das html-Element allein
deckt das nicht ab.
Nebenbei: Algorithm.Argon2id ist ein const enum und laesst sich mit
isolatedModules nicht importieren. Die Angabe entfaellt, @node-rs/argon2
benutzt von sich aus Argon2id.
Die Anmeldeseite laedt jetzt ohne einen einzigen Konsolenfehler.
Etappe: 8
Phase: Haertung
This commit is contained in:
+15
-5
@@ -10,16 +10,24 @@ import { NextResponse, type NextRequest } from 'next/server'
|
||||
* Google, kein CDN, keine Analytics. Was nicht aus dieser Anwendung kommt,
|
||||
* darf nicht geladen werden - hier liegen Gesundheits- und Finanzdaten.
|
||||
*
|
||||
* 'strict-dynamic' erlaubt es dem Next.js-Loader, weitere eigene Skripte
|
||||
* nachzuladen, ohne dass jede einzelne Datei aufgelistet werden muss.
|
||||
* Im Produktivbetrieb gilt 'strict-dynamic': Next.js haengt die Nonce an
|
||||
* seine eigenen Skript-Tags, und diese duerfen dann weitere eigene
|
||||
* Skripte nachladen. Kein Fremdskript kommt durch, auch nicht ueber eine
|
||||
* eingeschleuste <script src>-Zeile.
|
||||
*
|
||||
* Bewusste Zugestaendnisse:
|
||||
* Im Entwicklungsmodus geht das NICHT: 'strict-dynamic' schaltet die
|
||||
* Freigabe nach Herkunft ab, also auch 'self'. Der Hot-Reload und die
|
||||
* Fehleranzeige von Next.js laden aber Skripte ohne Nonce
|
||||
* (webpack.js, react-refresh.js, das Fehler-Overlay des Pages-Routers).
|
||||
* Die wuerden alle blockiert - man saehe eine tote Seite statt der
|
||||
* Fehlermeldung. Deshalb hier bewusst die lockere Fassung.
|
||||
*
|
||||
* Weitere bewusste Zugestaendnisse:
|
||||
* - style-src erlaubt 'unsafe-inline'. Tailwind selbst braucht das nicht,
|
||||
* aber Next.js und Radix setzen Inline-Styles fuer Positionierung. Das
|
||||
* Risiko ist bei Styles deutlich kleiner als bei Skripten.
|
||||
* - img-src erlaubt data: - QR-Codes und Belegvorschauen werden als
|
||||
* Data-URI eingebettet, statt sie ueber einen Fremddienst zu holen.
|
||||
* - Im Entwicklungsmodus braucht der Hot-Reload 'unsafe-eval'.
|
||||
*/
|
||||
|
||||
/** Ohne Authentifizierungs-Cookie gar nicht erst weiterreichen. */
|
||||
@@ -43,7 +51,9 @@ export function middleware(anfrage: NextRequest) {
|
||||
|
||||
const richtlinie = [
|
||||
`default-src 'self'`,
|
||||
`script-src 'self' 'nonce-${nonce}' 'strict-dynamic'${istEntwicklung ? " 'unsafe-eval'" : ''}`,
|
||||
istEntwicklung
|
||||
? `script-src 'self' 'unsafe-inline' 'unsafe-eval'`
|
||||
: `script-src 'self' 'nonce-${nonce}' 'strict-dynamic'`,
|
||||
`style-src 'self' 'unsafe-inline'`,
|
||||
`img-src 'self' blob: data:`,
|
||||
`font-src 'self'`,
|
||||
|
||||
Reference in New Issue
Block a user