Kortingscodes (coupons) zijn een onmisbare marketingtool voor elke WooCommerce-webshop. Ze worden via nieuwsbrieven, pop-ups en social media verspreid om klanten te stimuleren een aankoop te doen. Omdat de codes en hun beschrijvingen door webshopeigenaren handmatig in het dashboard worden ingevoerd, gaan veel ontwikkelaars ervan uit dat deze data inherent veilig is. Echter, als een account van een shopmanager wordt gecompromitteerd, kunnen kortingscodes worden misbruikt als vector voor Stored Cross-Site Scripting (XSS).
Het mechanisme van Coupon-gebaseerde XSS
In WooCommerce heeft elke kortingscode een unieke naam (de code die de klant intypt, zoals ZOMER2026) en een optionele beschrijving. Deze beschrijving wordt vaak getoond in de winkelwagen of op de checkout-pagina zodra de korting succesvol is toegepast (bijv. "Kortingscode succesvol toegepast: 10% korting op alles").
Als een aanvaller toegang krijgt tot het dashboard (bijvoorbeeld via credential stuffing op een slecht beveiligd account van een medewerker), kan hij een nieuwe kortingscode aanmaken met een kwaadaardige JavaScript-payload in de beschrijving of in de naam van de coupon zelf:
<img src=x onerror=alert(document.cookie)>
Wanneer een legitieme klant vervolgens tijdens het winkelen een geldige kortingscode invoert, verwerkt WooCommerce de code via AJAX. De frontend herlaadt de winkelwagen en print de beschrijving van de coupon op het scherm. Als het thema de beschrijving onveilig rendert, wordt het script uitgevoerd in de browser van de klant.
Gevaren voor de e-commerce reputatie
Zodra het kwaadaardige script actief is in de browser van de klant op de checkout-pagina, kan het gevoelige gegevens onderscheppen. Dit kan leiden tot:
-
Het stelen van de sessie-cookies van de klant.
-
Het injecteren van nepframing-velden die vragen om creditcardgegevens (skimming).
-
Onherstelbare merkschade wanneer beveiligingssoftware de webshop markeert als frauduleus.
Hoe ontwikkelaars XSS via coupons voorkomen
Thema- en plug-in ontwikkelaars moeten er altijd voor zorgen dat gegevens uit de database veilig worden weergegeven op de frontend. Gebruik bij het renderen van coupon-data altijd de juiste escaping-functies, zoals esc_html() of wp_kses_post().
$coupon = new WC_Coupon( $coupon_code );
$description = $coupon->get_description();
// ONVEILIGE WEERGAVE
echo '<div class="coupon-msg">' . $description . '</div>';
// VEILIGE WEERGAVE
echo '<div class="coupon-msg">' . esc_html( $description ) . '</div>';
Praktisch advies voor webshopeigenaren
-
Beperk rechten voor couponbeheer: Geef medewerkers die alleen marketingacties opzetten geen volledige toegang tot alle WooCommerce-instellingen. Gebruik rollenbeheer-plug-ins om hun rechten strikt te beperken tot het aanmaken van coupons, en ontzeg hen het recht om unfiltered HTML te publiceren.
-
Regelmatige audits: Loop periodiek door de lijst met actieve kortingscodes in uw dashboard en controleer of er geen vreemde codes of onbekende beschrijvingen tussen staan.
