Product Add-ons zijn plug-ins waarmee klanten een product kunnen personaliseren voordat ze het in de winkelwagen plaatsen (bijvoorbeeld een cadeauverpakking toevoegen, een tekst laten graveren of extra garantie selecteren). Deze add-ons berekenen een meerprijs bovenop de standaard productprijs. Als de logica achter deze prijsberekening niet strikt op de server wordt gevalideerd, kunnen aanvallers de prijs van de add-on manipuleren en dure opties gratis verkrijgen.

Het mechanisme van add-on prijsmanipulatie

Een veelgemaakte fout bij het ontwikkelen van product add-ons is het vertrouwen op de gegevens die via het HTML-formulier vanaf de computer van de klant worden meegestuurd. Stel dat een website een optie aanbiedt voor "Luxe Gravure" die €25,00 extra kost. Het formulier op de productpagina bevat de volgende structuur:

HTML
 
<input type="checkbox" name="add_on_option" value="gravure" />
<input type="hidden" name="add_on_price" value="25.00" />

Wanneer de klant op de knop "In winkelmand" klikt, verwerkt de plug-in het POST-verzoek. Een aanvaller kan de ontwikkelaarstools van zijn browser openen en de waarde van add_on_price handmatig veranderen naar 0.00 of zelfs -50.00.

Als de plug-in de meegestuurde prijs direct overneemt en aan de WooCommerce-winkelwagen toevoegt zonder in de database te controleren of de optie "gravure" daadwerkelijk €25,00 hoort te kosten, zal de winkelwagen het product met de gemanipuleerde (lagere) prijs berekenen.

Hoe ontwikkelaars prijsmanipulatie effectief voorkomen

De gouden regel voor e-commerce ontwikkelaars is: Prijzen worden uitsluitend uit de database geladen op basis van een unieke ID, nooit op basis van invoer uit een formulier.

Ontwikkelaars moeten gebruikmaken van de WooCommerce hook woocommerce_before_calculate_totals om de winkelwagen-items op serverniveau te controleren en de prijzen te forceren op basis van de hardcoded of in de database opgeslagen prijsregels:

PHP
 
add_action('woocommerce_before_calculate_totals', 'verify_addon_prices', 10, 1);

function verify_addon_prices($cart) {
    if (is_admin() && !defined('DOING_AJAX')) return;

    foreach ($cart->get_cart() as $cart_item) {
        if (isset($cart_item['chosen_addons'])) {
            $real_addon_price = 0;
            foreach ($cart_item['chosen_addons'] as $addon_id) {
                // Haal de echte prijs ALTIJD op uit de database via de ID
                $real_addon_price += My_Addon_Helper::get_addon_price_from_db($addon_id);
            }
            // Forceer de correcte prijs op serverniveau
            $base_price = $cart_item['data']->get_regular_price();
            $cart_item['data']->set_price($base_price + $real_addon_price);
        }
    }
}

Advies voor webshopeigenaren

  • Test uw formulieren: Probeer zelf een product met extra opties te bestellen en controleer of u via de browserelementen de prijs kunt veranderen.

  • Gebruik gerenommeerde add-on plug-ins: Gebruik bij voorkeur de officiële WooCommerce Product Add-Ons extensie. Deze extensie is grondig getest op server-side prijsvalidatie en is immuun voor dit type manipulatie.