18 lines
1.1 KiB
JavaScript
18 lines
1.1 KiB
JavaScript
// 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;
|
|
}
|