feed.js: HTML-Injection in linkify schließen (escapeHtml deckt nun Quotes ab)

escapeHtml nutzte den textContent->innerHTML-Trick, der laut HTML-Spec nur
& < > escaped, aber keine Anführungszeichen (in Textknoten harmlos). linkify
steckt den Wert anschließend in ein href="..."-Attribut, wo ein rohes " das
Attribut vorzeitig schließt und beliebige Attribute (on...=, style=) am <a>
einschleusbar macht -- HTML-Injection. Die CSP (default-src 'self', kein
'unsafe-inline') verhinderte nur die Ausführung, nicht die Injektion.

Ersetzt durch einen spec-korrekten Entity-Escaper, der auch " und ' abdeckt,
sodass der Wert in Text- UND Attributkontext sicher ist.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-16 07:52:18 +02:00
parent 85c283404d
commit 0089bc5909
+9 -3
View File
@@ -15,10 +15,16 @@ const api = {
},
};
// Escaped für Text- UND Attributkontext. Der frühere textContent->innerHTML-
// Trick ließ Anführungszeichen stehen (in Textknoten harmlos); linkify steckt
// den Wert aber in ein href="..."-Attribut, wo ein " ausbrechen würde.
function escapeHtml(s) {
const d = document.createElement("div");
d.textContent = s ?? "";
return d.innerHTML;
return String(s ?? "")
.replace(/&/g, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;")
.replace(/'/g, "&#39;");
}
// avatarUrl liefert den Bildpfad oder das Platzhalterbild bei leerem Avatar.