Härtung (Code-Review): persistiertes Session-Secret statt Default-Fallback; timing-safe API-Token-Vergleich; Secure-Cookie auf HTTPS; HTML-Sanitizer für richtext/html-Blöcke + Seiten-Body (Stored-XSS); 14 Unit-Tests (Rabatt/MwSt/Versand/Sanitizer) + npm test
This commit is contained in:
@@ -0,0 +1,17 @@
|
||||
// Leichtgewichtiger HTML-Sanitizer für Admin-/AI-erstellte Inhalte (richtext/html-Blöcke, Seiten-Body).
|
||||
// Entfernt aktive Vektoren (script/style/link/meta/object/embed, on*-Handler, javascript:/data:text-html-URLs).
|
||||
// iframe bleibt erlaubt (Embeds wie Karten/Video), da kein direktes Eltern-XSS.
|
||||
export function sanitizeHtml(input) {
|
||||
if (input == null) return '';
|
||||
let s = String(input);
|
||||
// gefährliche Elemente inkl. Inhalt entfernen
|
||||
s = s.replace(/<\s*(script|style|object|embed)\b[\s\S]*?<\s*\/\s*\1\s*>/gi, '');
|
||||
// selbstschließende/lose gefährliche Tags
|
||||
s = s.replace(/<\s*(script|style|link|meta|object|embed)\b[^>]*>/gi, '');
|
||||
// Inline-Event-Handler (onclick=, onerror=, …)
|
||||
s = s.replace(/\son\w+\s*=\s*("[^"]*"|'[^']*'|[^\s>]+)/gi, '');
|
||||
// javascript:- und data:text/html-URLs in href/src neutralisieren
|
||||
s = s.replace(/(href|src|xlink:href)\s*=\s*("\s*javascript:[^"]*"|'\s*javascript:[^']*'|javascript:[^\s>]+)/gi, '$1="#"');
|
||||
s = s.replace(/(href|src)\s*=\s*("\s*data:text\/html[^"]*"|'\s*data:text\/html[^']*')/gi, '$1="#"');
|
||||
return s;
|
||||
}
|
||||
Reference in New Issue
Block a user