Insecure Direct Object References (IDOR) is een veelvoorkomend probleem binnen e-commerce extensies. Het treedt op wanneer een applicatie een directe sleutel (zoals een opeenvolgend nummer) gebruikt om een object op te vragen, zonder te controleren of de aanvrager wel het recht heeft om dat object in te zien. Binnen WooCommerce-omgevingen komt dit risico vaak voor bij plug-ins die PDF-facturen of pakbonnen genereren op basis van sequentiële factuurnummers.
Het mechanisme van een Factuur-IDOR lek
Standaard gebruikt WooCommerce willekeurige post-ID's voor bestellingen, wat IDOR bemoeilijkt omdat de nummers niet opeenvolgend zijn. Veel plug-ins voor boekhouding en facturatie genereren echter wel opeenvolgende factuurnummers (bijv. INV-2026-0001, INV-2026-0002) om te voldoen aan de belastingwetgeving.
Als de plug-in een openbaar endpoint biedt om facturen te downloaden via dit nummer: https://uwshop.nl/download-invoice/?number=INV-2026-0002
Een ingelogde klant die zijn eigen factuur (INV-2026-0002) heeft gedownload, kan het nummer in de URL handmatig veranderen naar INV-2026-0001. Als de backend van de plug-in alleen controleert of de factuur bestaat, maar vergeet te verifiëren of het gekoppelde klant-ID overeenkomt met het ID van de momenteel ingelogde gebruiker, krijgt de klant de factuur van iemand anders te zien. Dit vormt een direct en ernstig datalek (schending van de AVG/GDPR).
Hoe ontwikkelaars IDOR op facturen voorkomen
Bij het bouwen van download-handlers moeten ontwikkelaars altijd controleren of de huidige gebruiker de eigenaar is van de bestelling die aan de factuur is gekoppeld, of dat de gebruiker de capaciteit manage_woocommerce (voor administrators/shopmanagers) bezit:
$invoice_number = sanitize_text_field($_GET['number']);
$order_id = My_Invoice_Helper::get_order_id_by_invoice_number($invoice_number);
$order = wc_get_order($order_id);
if ($order) {
$current_user_id = get_current_user_id();
// Controleer of de klant de eigenaar is van de order OF dat het een beheerder is
if ($order->get_customer_id() === $current_user_id || current_user_can('manage_woocommerce')) {
// Genereer en serveer de PDF veilig
} else {
wp_die('Toegang geweigerd. U bent niet geautoriseerd om deze factuur te bekijken.', 'Fout', array('response' => 403));
}
}
Wat kan een webshopeigenaar doen?
-
Voer handmatige checks uit: Log in met een test-klantaccount, download uw factuur en probeer het nummer in de URL aan te passen om te controleren of u de data van andere testaccounts kunt inzien.
-
Kies gecertificeerde plug-ins: Gebruik uitsluitend veelgebruikte facturatie-plug-ins (zoals WooCommerce PDF Invoices & Packing Slips) die bekend staan om hun strikte toegangscontroles.
