Schriften ins Repository, Anleitung fuer neue Websites, Schutzkopfzeilen
Die Lato-Dateien liegen jetzt unter public/assets/fonts/ samt OFL-Text und einer Lizenznotiz: auf einem frischen Server fehlt nichts, und es wird nie versehentlich von Google geladen. docs/NEUE-WEBSITE.md beschreibt, wie eine neue Kundenwebsite entsteht - Reihenfolge, Dokumentformat, Bilder, SEO, Pruefungen - und nennt am Ende die fuenf Fehler, die hier immer wieder passiert sind. Permissions-Policy ergaenzt (Kamera, Mikrofon, Standort, Sensoren aus), X-Powered-By entfernt: der Server nannte in jeder Antwort seine genaue PHP-Fassung. Die Browserpruefung misst die Kopfzeilen jetzt. Behoben: der Editor kannte Schema v17, der Validator v18 - die Beitragsnavigation liess sich in keinem aktuellen Dokument einfuegen. Ein Test bindet die Zahl des Editors an die des Validators. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
7c6b2a9ec8
commit
a2dfd0f796
20 files changed
+401
-3
No files matched your search
@@ -31,6 +31,24 @@ try {
|
||||
if (200 === expected) assert.match(response.headers()['content-type'] ?? '', new RegExp(type), path);
|
||||
}
|
||||
results.push({ name: 'machine readable routes reachable', paths: 3, hasPosts });
|
||||
|
||||
// Die Schutzkopfzeilen einer öffentlichen Seite. Sie fehlen lautlos, wenn jemand eine Antwort
|
||||
// an der Stelle vorbeibaut, die sie setzt - deshalb werden sie gemessen und nicht angenommen.
|
||||
{
|
||||
const seite = await context.request.get(origin + '/');
|
||||
const kopf = seite.headers();
|
||||
const csp = kopf['content-security-policy'] ?? '';
|
||||
assert.match(csp, /default-src 'self'/, 'Content-Security-Policy fehlt');
|
||||
assert.match(csp, /object-src 'none'/, 'Plugins müssen verboten bleiben');
|
||||
assert.match(csp, /frame-ancestors 'none'/, 'Die Seite darf nicht in einen fremden Rahmen');
|
||||
assert.match(csp, /base-uri 'none'/, 'Ein eingeschleustes <base> würde jeden Verweis umlenken');
|
||||
assert.equal(kopf['x-content-type-options'], 'nosniff');
|
||||
assert.match(kopf['referrer-policy'] ?? '', /strict-origin/);
|
||||
assert.match(kopf['permissions-policy'] ?? '', /camera=\(\)/);
|
||||
// Und was nicht dastehen darf: die Serverkennung verrät, wonach ein Angreifer suchen kann.
|
||||
assert.ok(!('x-powered-by' in kopf) || !/php/i.test(kopf['x-powered-by']), 'X-Powered-By nennt die PHP-Fassung');
|
||||
results.push({ name: 'security headers', csp: csp.length });
|
||||
}
|
||||
await context.close();
|
||||
|
||||
// A load budget, measured rather than assumed: what a page actually transfers, and how many
|
||||
|
||||
Reference in new issue
Block a user