De WooCommerce REST API stelt externe applicaties en mobiele apps in staat om veilig verbinding te maken met de webshop. Veel van deze applicaties maken gebruik van applicatiesleutels (Consumer Key en Consumer Secret), maar sommige integraties gebruiken directe gebruikers-authenticatie via API-endpoints (zoals JWT of OAuth-extensies). Als deze specifieke endpoints niet correct zijn beveiligd tegen overmatige verzoeken, ontstaat er een ernstig risico op brute-force aanvallen die traditionele inlog-beperkingen volledig omzeilen.

Waarom API Brute-Force gevaarlijker is dan standaard inlog-spam

De meeste WordPress-beheerders installeren plug-ins om de standaard wp-login.php pagina te beschermen tegen brute-force aanvallen. Deze beveiligingsplug-ins monitoren mislukte inlogpogingen via het webformulier en blokkeren het IP-adres na bijvoorbeeld 5 foutieve pogingen.

Echter, veel van deze plug-ins monitoren de REST API-endpoints (zoals /wp-json/wp/v2/users of aangepaste authenticatie-routes van WooCommerce-extensies) standaard niet. Een aanvaller kan een script bouwen dat duizenden wachtwoordcombinaties rechtstreeks als JSON-payloads naar de API stuurt:

JSON
 
POST /wp-json/jwt-auth/v1/token HTTP/1.1
Host: uwshop.nl
Content-Type: application/json

{
    "username": "admin",
    "password": "ZwakWachtwoord123"
}

Omdat API-verzoeken sneller worden verwerkt door de server (omdat er geen zware HTML-interface hoeft te worden gerenderd), kan een hacker veel meer pogingen per minuut uitvoeren. Dit verhoogt de kans op een succesvolle account-overname aanzienlijk en veroorzaakt tegelijkertijd een enorme serverbelasting.

Hoe ontwikkelaars API Endpoints beschermen

Ontwikkelaars die authenticatie-endpoints bouwen voor WooCommerce-extensies moeten expliciet Rate Limiting (snelheidsbeperking) integreren in de API-logica. Dit kan door gebruik te maken de de WordPress Transient API om het aantal verzoeken per IP-adres of per gebruikersnaam bij te houden:

PHP
 
add_filter('rest_pre_dispatch', 'limit_api_auth_requests', 10, 3);

function limit_api_auth_requests($result, $server, $request) {
    if (strpos($request->get_route(), '/jwt-auth/v1/token') !== false) {
        $ip = $_SERVER['REMOTE_ADDR'];
        $transient_key = 'api_auth_limit_' . md5($ip);
        $attempts = (int) get_transient($transient_key);

        if ($attempts >= 5) {
            return new WP_Error('too_many_requests', 'Te veel inlogpogingen via de API. Probeer het over een uur opnieuw.', array('status' => 429));
        }

        // Verhoog het aantal pogingen voor 1 uur
        set_transient($transient_key, $attempts + 1, HOUR_IN_SECONDS);
    }
    return $result;
}

Advies voor site-beheerders

  • Implementeer Rate Limiting op Cloudflare: Als u Cloudflare gebruikt, configureer dan een specifieke Rate Limiting-regel op het pad /wp-json/*. Blokkeer elk IP-adres dat binnen een minuut een onrealistisch aantal POST-verzoeken naar de API stuurt.

  • Schakel de REST API uit voor gasten: Als uw webshop geen openbare mobiele app heeft die voor gasten toegankelijk moet zijn, blokkeer dan de volledige REST API voor niet-ingelogde gebruikers via een beveiligingsplug-in.