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:
<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:
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.
