Stop gevaarlijke SVG’s bij de voordeur: zo harden je WordPress-uploads

Waarom SVG’s plots bovenaan je risicolijst staan

SVG’s zijn geliefd voor haarscherpe iconen en logo’s, maar ze zijn ook code. In tegenstelling tot PNG of JPG kan een SVG scripts, externe verwijzingen en ingebedde HTML bevatten. Recent meldde VirusTotal dat besmette SVG’s vaak langs antivirus glippen. Dat maakt het riskant om SVG-upload zomaar aan te zetten in WordPress — zeker omdat WordPress ze standaard blokkeert en veel sites ze via een plugin alsnog toelaten.

Beleid eerst: uitschakelen of gecontroleerd toestaan

De veiligste keuze is simpel: laat SVG’s niet toe als je ze niet nodig hebt. Werk je met een strak huisstijlhandboek? Overweeg om SVG’s vooraf centraal te laten keuren of te rasterizen naar PNG. Moeten SVG’s toch kunnen, beperk dan wie mag uploaden (alleen beheerders of een specifieke rol) en documenteer wanneer een SVG nodig is en hoe die wordt aangeleverd.

  • Sta SVG’s alleen toe voor vertrouwde rollen
  • Hanteer een whitelisting-proces (bron, maker, doel)
  • Houd een logboek bij van geüploade SVG’s

Hygiënisch uploaden: MIME-checks en sanitisers

Omdat SVG tekst is, kun je niet op bestandsnaam vertrouwen. Combineer daarom WordPress- en servercontroles. In WordPress is een beproefde route het inzetten van een sanitizer die gevaarlijke elementen (zoals scripts, events en foreignObject) wegsnijdt. De plugin Safe SVG gebruikt een veelgebruikte sanitizer-library en dwingt standaard schonere SVG’s af. Vermijd plugins die SVG’s inline injecteren zonder strikte filtering.

Voeg daarnaast server-side checks toe. Controleer de werkelijke MIME-type op upload, zet X-Content-Type-Options op nosniff en verwerp SVG’s met actieve inhoudspatronen. Dit vangt manipulatie van bestandsextensies af en geeft een tweede verdedigingslinie mocht WordPress-controle falen.

Veilig serveren: beperk hoe de browser rendert

Zelfs een geschoonde SVG wil je alleen als afbeelding laten gebruiken. Stel een Content Security Policy in die object/embed blokkeert en het aanroepen van scripts vanuit SVG onmogelijk maakt. Een praktische baseline: object-src ‘none’, frame-ancestors ‘none’, img-src ‘self’ data:, script-src ‘self’. Combineer dit met strikte headers op je uploads-domein of -pad en overweeg om SVG’s desnoods vanuit een subdomein te serveren zonder scriptrechten.

Defence-in-depth: WAF, rechten en monitoring

Een moderne WAF kan verdachte uploadverzoeken richting /wp-admin/async-upload.php of admin-ajax afkappen en bepaalde bestandstypen per rol of IP-range beperken. Koppel dat aan least-privilege: auteurs hoeven zelden SVG’s te uploaden. Log alle uploads met content-type image/svg+xml, en scan periodiek je mediabibliotheek op verdachte patronen. Rendar ziet in audits dat juist deze combinatie – sanitizer, headers, WAF-regels en rolbeleid – het aantal incidenten drastisch terugbrengt.

Waar te beginnen

Kies eerst je beleid (uit of beperkt), activeer daarna een sanitizer en stel basisheaders en CSP in. Test vervolgens of je site geen SVG meer rendert via object/embed en of je WAF onnodige paden dichtzet. Wil je dit robuust neerzetten of koppelen aan een bestaande release- en hostingpipeline? Rendar helpt met hardened WordPress-setups, CI-gebaseerde sanitizing en WAF-configuraties die passen bij je omgeving. Lees meer over onze aanpak bij professionele WordPress-websites en webapplicatiebeveiliging, of neem direct contact op via onze contactpagina.

Praktische takeaway: laat SVG’s niet ongemerkt binnen. Beslis bewust, saniteer strikt en dwing veilige rendering en rollen technisch af. Zo blijft je merk scherp en je WordPress veilig.