From 95fee1d8c5c73183a247bb14e1e5d31155b724d2 Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Fri, 12 Jun 2026 21:56:46 +0300 Subject: [PATCH] =?UTF-8?q?fix(security):=20=D1=83=D0=B1=D1=80=D0=B0=D1=82?= =?UTF-8?q?=D1=8C=20stored-XSS=20=D0=B2=20=D0=B1=D0=BB=D0=BE=D0=BA=D0=B5?= =?UTF-8?q?=20columns=20=D1=83=D1=80=D0=BE=D0=BA=D0=B0=20(=D0=A1=D0=BF?= =?UTF-8?q?=D1=80=D0=B8=D0=BD=D1=821=20#4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Блок columns хранит rich-HTML из мини-редактора и рендерился сырым в innerHTML (единственный неэкранированный блок) — учитель мог внедрить /script, исполняемый у каждого ученика (кража JWT из localStorage). Добавлен санитайзер sanitizeRichHtml (инертный template + вырезание on*/script/iframe/javascript:), сохраняет форматирование, но блокирует исполнение. Co-Authored-By: Claude Opus 4.8 --- frontend/lesson.html | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/frontend/lesson.html b/frontend/lesson.html index fa450ce..4aae0ff 100644 --- a/frontend/lesson.html +++ b/frontend/lesson.html @@ -897,6 +897,23 @@ /* ── helpers ── */ function escAll(s) { return String(s||'').replace(/&/g,'&').replace(//g,'>').replace(/"/g,'"'); } + /* Санитайзер rich-HTML (блок columns хранит форматированный HTML из мини-редактора). + Парсим в инертный