Reference in New Issue
Block a user
Delete Branch "fix/html-embed-hardening"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Усиления безопасности фичи html-embed, найденные в security-review PR #16 (смержен в develop). Ветка от
develop, по коммиту на issue. Closes #28, #30.Что сделано
#28 — завершение kill-switch: strip эмбедов на серверe на всех authenticated read-путях (
6a052b88)Тоггл
htmlEmbedдолжен мгновенно нейтрализовать все эмбеды при выключении. Путь публичной шары уже вырезал на serve-time, но аутентифицированные read-пути (/infoи/history/info) отдавалиcontentс эмбедами как есть → после выключения фичи страница с уже сохранённым (админским) эмбедом продолжала исполнять JS у view-only пользователей до следующего сохранения. Теперь оба пути резолвят workspace-тоггл и прогоняютstripHtmlEmbedNodes, когда он OFF (fail-closed при отсутствии workspace), ДО конвертации форматов. Только админский контент — это полнота kill-switch, не privilege escalation. ВPageControllerинъектитсяWorkspaceRepo.(
/history/infoдобавлен после замечания ревью — снапшоты истории это тоже read-путь.)#30 —
stripHtmlEmbedNodesтотальна (проверка корневого узла) (8ee4279d)Функция фильтровала только детей, поэтому (никогда не встречающийся на практике) голый
htmlEmbed-корень вернулся бы как есть. Добавлена защитная проверка корня → возвращает embed-free doc; функция больше не может вернуть узел, для которогоhasHtmlEmbedNode === true. Добавлен юнит-тест на корневой кейс (html-embed.spec.ts — 17/17 зелёные).Как рассуждал
page.content/history.contentна месте — оба return-пути берут очищенный контент. Переиспользовал готовые хелперы (isHtmlEmbedFeatureEnabled,stripHtmlEmbedNodes) иWorkspaceRepo, как в share.service.PageRepo.findByIdвсегда селектитworkspaceId(иначе fail-closed резал бы и при ON) и чтоWorkspaceRepoэкспортируется из @Global DatabaseModule (нет циклов).Косяки, найденные на ревью
/history/infoтоже отдаёт сырой контент → расширил #28 и на него.Проверка
tsc --noEmit— без новых ошибок (есть известные pre-existing TS2554 в transclusion-спеках, не связаны).jest html-embed.spec.ts— 17/17.НЕ вошло (осознанно)
🤖 Generated with Claude Code
Ghost referenced this pull request2026-06-21 02:05:02 +03:00
Ghost referenced this pull request2026-06-21 02:05:22 +03:00