fix(import): neutraliseer Markdown-/YAML-injectie uit presentatie-import (#876) #889
No reviewers
Labels
No labels
accepted
bug
declined
docs
duplicate
enhancement
good first issue
in-progress
needs-info
privacy
security
triage
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
LibreKAT/Ocideck!889
Loading…
Reference in a new issue
No description provided.
Delete branch "fix/876-import-injection"
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?
Tekst uit een geïmporteerde
.pptx/.odp/.key— data van wie het bestand maakte — belandde rauw in het.md: een titel, bullet of quote met<script>, een slide-separator (---), een-afbeelding of eenjavascript:-link kreeg zo structurele of uitvoerbare betekenis in het opgeslagen deck, en de fail-closed poort die een vreemd.mdbij het openen tegenhoudt werd op de importroute niet doorlopen.Aanpak (afgestemd: aan de importgrens)
lib/services/import/utils/import_text_sanitizer.dart): HTML-metatekens inert (&/</>, defuset elke<tag-vector dieMarkdownSafetyScannerkent, incl. numerieke-entity-evasie), link-/afbeeldingssyntax gebroken ([→\[,](→]\(), regeleinden gevouwen, leidend blokteken ontsnapt. Twee varianten: vol voor rauw-geserialiseerde velden, inline voor velden met een eigen escaper (tabelcel, notitie) — componeert zonder dubbel te escapen.deck_builder.dart: titel, subtitle, bullets, quote, quote-auteur, section, timeline, vrije Markdown, chart-labels, linktekst, tabelcel, notitie, geneutraliseerde-link-issue-args. Twee-koloms bullets en captions zijn al HTML-veilig via_escapeHtmlen leunen op de backstop._safeUrl, ook op de video-ref): percent-encodeert link-breekout-tekens (witruimte, C0,()<>), zodat een newline in een URL geen dia, tracking-beacon of directive kan binnensmokkelen. Een schone URL blijft ongewijzigd (de YouTube-/Vimeo-embed werkt).MarkdownSafetyScanner(scanDeckForUnsafeContent) vóórloadDeck/saveDeck— de import raakt de poort nu wél (dat deed hij niet), en een opgeslagen import wordt niet alsnog bij het heropenen geweigerd. Bulk/service weigert metImportFailureReason.unsafeContent, de enkel-bestand-UI toont hetzelfde alarm als bij een vreemd bestand._yamlScalar): gereserveerde woorden (true/false/null/~) worden gequote en controltekens (\r/\t/rest) afgehandeld, zodat een geïmporteerde titeltrueals string round-trippt en een kale\rde front matter niet splitst. Round-trip-neutraal; getallen ongemoeid.Reviews
[tekst](url), backstop-blind); ronde 2 dezelfde klasse in de video-ref. Beide gedicht via_safeUrl, met regressietests die eerst rood stonden. Ronde 3: sweep over élkSourceSlide/SourceDeck-veld — geen resterend veld van die klasse.Tests
26 sanitizer-tests (scanner-als-orakel per vector) + 11 integratietests (sanitizing → scanner-schoon per context, geen extra dia, backstop vangt twee-koloms-residu, service weigert, URL-/video-/caption-newline-regressies, YAML-round-trip). 31 l10n-vertalingen voor de
unsafeContent-melding.Poort
make checkis groen op élke poort die de #876-code raakt (format, analyse, conventies, methodelengte, dode-code, hardgecodeerde tekst, commentaartaal, de import-/markdown-/front-matter-tests, dekking), secrets- en SAST-scan schoon.Kanttekening bij de rebase (niet #876): deze tak is gerebased op main na de parallel gemergede #865/#872/#870. Die migratie (#870, dartcv4) liet main's
make checkrood op meerdere punten die niets met #876 te maken hebben: een cmake-eis (native-assets-hook), een format-drift + een lint in de presenter-bestanden, het klasse-plafond dat #865/#872 overschreden, een ontbrekende dartcv4-vermelding inTHIRD_PARTY_NOTICES, en een flaky gezichtsdetectietest (slaagt geïsoleerd). De trivialе drie (format, lint, plafond) zijn in de laatstechore-commit mechanisch gedeblokkeerd, gelabeld en met attributie; de notices en de flake horen bij #870 en zijn als aparte kwestie gemeld. Deze PR is daarom bewust op het bewijs gemerged: #876's eigen code, poorten en reviews zijn groen; de resterende ruis is #870's onafgemaakte migratie.Closes #876