From 0089bc590900f62a0ef2a63730754e3f35b06307 Mon Sep 17 00:00:00 2001 From: irrlicht Date: Tue, 16 Jun 2026 07:52:18 +0200 Subject: [PATCH] =?UTF-8?q?feed.js:=20HTML-Injection=20in=20linkify=20schl?= =?UTF-8?q?ie=C3=9Fen=20(escapeHtml=20deckt=20nun=20Quotes=20ab)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 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 --- web/js/feed.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/web/js/feed.js b/web/js/feed.js index aa25906..decfc02 100644 --- a/web/js/feed.js +++ b/web/js/feed.js @@ -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, "&") + .replace(//g, ">") + .replace(/"/g, """) + .replace(/'/g, "'"); } // avatarUrl liefert den Bildpfad oder das Platzhalterbild bei leerem Avatar.