Wanneer een klant een betaling afrondt via een gateway zoals PayPal, Mollie of Stripe, communiceert de betalingsprovider de status van de transactie terug naar WooCommerce via een zogenaamd IPN-verzoek (Instant Payment Notification) of een Webhook. Dit verzoek vertelt WooCommerce of de betaling is geslaagd, zodat de status van de bestelling automatisch kan worden aangepast naar "Verwerking". Als een plug-in deze inkomende notificaties niet correct valideert, kan een aanvaller het IPN-verzoek vervalsen en WooCommerce wijsmaken dat hij heeft betaald.
Het gevaar van een vervalst IPN-verzoek
Stel dat een slecht gecodeerde payment-plug-in luistert naar een openbaar endpoint: https://uwshop.nl/?my_plugin=paypal_ipn. Wanneer er een POST-verzoek binnenkomt, controleert de plug-in alleen de meegestuurde variabelen:
if ($_POST['payment_status'] == 'Completed') {
$order = wc_get_order($_POST['custom_order_id']);
$order->payment_complete();
}
Een aanvaller kan eenvoudig de ontwikkelaarstools gebruiken of een tool zoals Postman om zelf een HTTP POST-verzoek naar dit endpoint te sturen. Hij vult zijn eigen bestellingsnummer in en zet de status op Completed. De webshop zal direct denken dat de betaling binnen is en het (digitale) product verzenden, zonder dat er daadwerkelijk één cent is overgemaakt.
Hoe betalingsnotificaties correct worden beveiligd
Om dit type fraude te voorkomen, moet de plug-in de authenticiteit van het IPN-verzoek dubbel controleren via een van de volgende twee methoden:
-
De Backchannel Verificatie: Zodra het IPN-verzoek binnenkomt, moet de WooCommerce-server op de achtergrond een direct verzoek terugsturen naar de officiële server van de betalingsprovider (bijv. PayPal) om te vragen: "Hebben jullie mij zojuist dit verzoek met deze data gestuurd?". Pas als de provider antwoordt met
VERIFIED, mag de status worden aangepast. -
Cryptografische Handtekeningen (Signatures): Moderne providers sturen een handtekening mee in de HTTP-headers (zoals besproken in het webhook-artikel). Deze handtekening kan alleen worden gegenereerd met een geheime sleutel die alleen bekend is bij u en de provider.
// Voorbeeld van veilige controle via Stripe SDK
try {
$event = \Stripe\Webhook::constructEvent(
$payload, $sig_header, $endpoint_secret
);
} catch(\UnexpectedValueException $e) {
// Ongeldige payload
status_header(400);
exit();
} catch(\Stripe\Exception\SignatureVerificationException $e) {
// Ongeldige handtekening -> Potentiële fraude!
status_header(400);
exit();
}
Advies voor webshopeigenaren
-
Gebruik officiële plug-ins: Maak uitsluitend gebruik van de officiële plug-ins van de betalingsproviders zelf (zoals de officiële Mollie voor WooCommerce of Stripe voor WooCommerce plug-ins). Vermijd verouderde of door amateurs gebouwde betaalkoppelingen.
-
IPN e-mailnotificaties: Schakel notificaties in bij uw betalingsprovider, zodat u direct een overzicht krijgt als er afwijkingen zijn tussen de geregistreerde transacties in uw bankomgeving en de orders in WooCommerce.
