Insecure Direct Object References (IDOR) is een kwetsbaarheid op het gebied van toegangscontrole die optreedt wanneer een applicatie een interne database-sleutel of een direct bestandspad gebruikt als parameter, zonder te verifiëren of de huidige gebruiker wel geautoriseerd is om dat specifieke object te bekijken of te downloaden. Binnen WooCommerce is dit een kritiek risico voor webshops die digitale producten verkopen (zoals e-books, software, cursussen of PDF-handleidingen). Een IDOR-lek kan ertoe leiden dat klanten betaalde producten gratis kunnen downloaden door simpelweg een getal in de URL aan te passen.
Het mechanisme van IDOR in download-plug-ins
Wanneer een klant een digitaal product koopt in WooCommerce, genereert het platform een unieke downloadlink. WooCommerce beschermt deze links standaard door gebruik te maken van unieke cryptografische ID's (UUID's) in de URL, wat erg veilig is omdat deze niet te raden zijn.
Het probleem ontstaat echter wanneer webshopeigenaren gebruikmaken van aanvullende plug-ins voor downloadbeheer, facturatie of lidmaatschappen die minder veilig zijn gecodeerd. Stel dat een plug-in voor het downloaden van facturen of productbijlagen de volgende URL-structuur gebruikt: https://uwshop.nl/download-invoice.php?invoice_id=4820
Als een ingelogde klant de parameter invoice_id handmatig verandert naar 4819 en de server controleert niet of deze factuur daadwerkelijk aan zijn gebruikers-ID is gekoppeld, is er sprake van een IDOR-kwetsbaarheid. De klant kan nu de facturen (inclusief NAW-gegevens) van andere klanten inzien. Op dezelfde manier kunnen digitale producten worden buitgemaakt als de downloadbestanden via sequentiële ID's worden opgevraagd.
Hoe ontwikkelaars IDOR-kwetsbaarheden voorkomen
Om IDOR te voorkomen, mag de server nooit blindelings vertrouwen op de parameters die de client (de browser) meestuurt. Elke actie waarbij data wordt opgevraagd, moet een expliciete autorisatiecontrole bevatten.
Binnen WordPress en WooCommerce moeten ontwikkelaars altijd controleren of de huidige ingelogde gebruiker de eigenaar is van het opgevraagde object:
$download_id = intval($_GET['download_id']);
$current_user_id = get_current_user_id();
// Haal de download/bestelling op uit de database
$order_id = get_post_meta($download_id, '_associated_order_id', true);
$order = wc_get_order($order_id);
if ($order) {
// Controleer of de huidige gebruiker de koper is van de bestelling
if ($order->get_customer_id() !== $current_user_id && !current_user_can('manage_woocommerce')) {
wp_die('Toegang geweigerd. U bent niet de eigenaar van dit bestand.', 'Niet Geautoriseerd', array('response' => 403));
}
// Verwerk de download veilig...
}
Tips voor webshopeigenaren
-
Kies de juiste downloadmethode: WooCommerce biedt onder Instelling > Producten > Digitale producten verschillende downloadmethoden aan. Kies bij voorkeur voor "Geforceerde downloads" of "X-Accel-Redirect/X-Sendfile". Dit zorgt ervoor dat de werkelijke bestandspaden op de server worden afgeschermd en dat directe toegang via de browser tot de downloadmap (
wp-content/uploads/woocommerce_uploads/) wordt geblokkeerd via een automatisch gegenereerd.htaccessbestand. -
Beperk het aantal downloadpogingen: Stel in de productinstellingen een limiet in voor het maximaal aantal keren dat een klant een digitaal product mag downloaden, en voeg een vervaldatum toe aan de downloadlinks.
