WooCommerce gebombardeerd met nepbestellingen
20 december 2024
Een bot die creditcards test
Ik heb een klant met een kleine, nichegerichte webshop op WooCommerce. Het is een zelfgehoste WordPress-omgeving met net genoeg maatwerk voor een paar specifieke behoeften. De laatste tijd zien we een gestage stroom mislukte bestellingen, ongeveer eentje per 10 minuten, allemaal met hetzelfde patroon. Je hoeft geen genie te zijn om botgedreven creditcardtests te vermoeden.
We probeerden reCaptcha v3. Het was houterig, maar werkte een tijd. Toen veranderden de aanvallers van tactiek en glipten er gewoon doorheen. Blijkbaar hadden we een grote zijdeur over het hoofd gezien.
Meerdere API's, wie wist dat?
Ik ben de rommel in het WordPress-ecosysteem gewend, maar hier komt een wending: WooCommerce introduceerde nog een API, de Store API, voornamelijk om hun block-based cart- en checkoutfuncties te ondersteunen. Het staat in hun developer-documentatie, maar er is geen prominente "aankondiging" op hun hoofdblog, en eerlijk gezegd volg ik deze ontwikkelingen niet op de voet, want WordPress is niet mijn ding.
Hoe dan ook, de Store API is bedoeld voor headless-ervaringen en moderne front-ends. Hij staat interacties op gastniveau toe. Dat is niet per se een "kwetsbaarheid" in klassieke zin, maar het is een ontwerpkeuze die rijp is voor misbruik door bots, en sommige voor de hand liggende waarborgen (zoals de mogelijkheid om de API of delen ervan uit te zetten als je het blocksysteem niet gebruikt) zijn niet ingevoerd. Ik vind dat behoorlijk problematisch.
De bot buitensluiten
Mijn eerste poging was een snelle fix: woocommerce_checkout_process gebruiken om verdachte e-mailadressen te filteren. Maar wat blijkt? De Store API speelt niet volgens dezelfde regels als de traditionele checkoutflow.
We gebruikten deze nieuwe API niet eens, maar hij stond klaar, rijp om te misbruiken. Dus ik ging op de scorched-earth-toer:
add_action( 'rest_api_init', function () {
if ( strpos( $_SERVER['REQUEST_URI'], '/wc/store' ) !== false ) {
wp_die(
json_encode( [ 'error' => 'Store API is disabled on this site.' ] ),
'Store API Disabled',
[ 'response' => 403, 'content-type' => 'application/json' ]
);
}
});Daag, Store API. Geen elegante oplossing, maar we gaan toch migreren.
Oorzaken
Dit project heeft vrijwel geen onderhoudsbudget. WooCommerce, het thema en de plug-ins bijhouden was al een uitdaging. We overwogen ooit Shopify, maar het had maatwerk nodig dat destijds niet realiseerbaar was zonder meer uit te geven dan we hadden.
Nu is de situatie anders. We kijken naar een gehost platform dat onze flexibiliteit beperkt maar betere beveiliging out of the box biedt. Ironisch genoeg ontstond de Store API waarschijnlijk om het leven te vergemakkelijken voor complexe headless-installaties, het soort grote budgetbouw dat zich kan veroorloven zijn pipelines te harden. Voor een piepkleine winkel met een minimaal budget helpt deze "vooruitgang" niet.