De flexibiliteit van WooCommerce is grotendeels te danken aan de krachtige filter- en zoekopties waarmee klanten snel de juiste producten kunnen vinden. Grote webshops maken intensief gebruik van gelaagde navigatie (layered navigation) op basis van productattributen (maat, kleur, merk, prijsklasse). Echter, als deze filters niet correct zijn gecacheerd of begrensd, kunnen ze door aanvallers worden misbruikt om een gerichte Denial of Service (DoS) aanval uit te voeren, waardoor de database van de webserver bezwijkt onder de belasting.
Het mechanisme van een Query-gebaseerde DoS
Wanneer een klant een productfilter gebruikt, vertaalt WordPress dit op de achtergrond naar een complexe database-query (vaak een tax_query of meta_query met meerdere JOIN commando's). Deze operaties zijn computationeel zeer zwaar voor de MySQL/MariaDB database.
Een aanvaller kan een geautomatiseerd script (een bot) bouwen dat duizenden unieke URL-combinaties tegelijk opvraagt, waarbij honderden filters tegelijkertijd geactiveerd worden: https://uwshop.nl/shop/?filter_kleur=rood,blauw,groen&filter_maat=xl,l,m,s&min_price=10&max_price=500&paged=5
Omdat elke URL uniek is, kan een standaard paginacache (zoals WP Rocket of een basis CDN) de verzoeken niet opvangen; de server moet voor elk verzoek een nieuwe database-query uitvoeren. Binnen enkele seconden raakt de database-server overbelast, schiet het CPU-gebruik naar 100%, en krijgen legitieme bezoekers een "Error Establishing a Database Connection" of een 504 Gateway Timeout te zien.
Hoe u uw filters beschermt tegen DoS-misbruik
1. Implementeer Object Caching
Standaard paginacache helpt niet tegen unieke filtercombinaties, maar Redis of Memcached (Object Caching) wel. Object caching slaat de resultaten van de database-queries zelf op in het werkgeheugen (RAM) van de server. Als een bot dezelfde of een vergelijkbare zware sub-query triggert, worden de gegevens direct uit het geheugen geladen, wat de database ontlast.
2. Begrens het aantal filterparameters
U kunt via code of via geavanceerde firewall-regels instellen dat verzoeken met een absurd aantal query-parameters automatisch worden geweigerd.
add_action('parse_request', 'limit_heavy_filter_requests');
function limit_heavy_filter_requests($wp) {
if (is_admin()) return;
// Tel het aantal actieve filters in de URL
$filter_count = 0;
foreach ($_GET as $key => $value) {
if (strpos($key, 'filter_') === 0) {
$filter_count++;
}
}
// Blokkeer het verzoek als er meer dan 5 filters tegelijk worden gebruikt
if ($filter_count > 5) {
wp_die('Te veel filtercriteria opgegeven.', 'Bad Request', array('response' => 400));
}
}
3. Gebruik Rate Limiting op uw WAF
Configureer uw Web Application Firewall (bijv. Cloudflare) om het aantal verzoeken per seconde per IP-adres op de /shop/ of /product-categorie/ pagina's strikt te limiteren. Als een bot sneller pagina's opvraagt dan een mens kan klikken, wordt het IP-adres direct tijdelijk geblokkeerd.
