Hallo Arjan,
Na drie pagina's reacties heb je nog steeds je antwoord niet. Het lullige is dat het helemaal niet om ingewikkelde hashcodes gaat, maar het 'lek' bestaat er gewoon in dat een bedrag, als de klant het gaat betalen in zijn browser ALTIJD via de klant zal gaan. Dus of dat nou via een hash gaat of zonder hash, het bedrag GAAT via de klant.
Wat moet je als webwinkel doen om dit soort hacks te voorkomen? Je moet de handleiding van je betaalprovider goed doornemen. En daar staat (bij een goede betaalprovider) altijd in dat je een payment confirmation pagina moet hebben. Zodat je een bericht van je betaalprovider ontvangt als je klant daar betaalt.
Wat is een payment confirmation dan precies? Het bedrag dat de klant uiteindelijk betaald (in Ideal, of via creditcard of wat dan ook) zal via de browser van de klant bij je terug komen. Maar dit bedrag is totaal onbetrouwbaar. De hash kan gekraakt worden, of als er geen hash is, het bedrag kan domweg worden aangepast zoals bij Justeat.
Maar dit weten betaalproviders (zoals dibs en Ogone, die de betaalafhandeling voor jou als webwinkel doen via Ideal of creditcard) natuurlijk ook. Dus zij bieden iets extra's. En dat extra's moet je als webwinkel natuurlijk wel implementeren.
Het extraatje wat betaalproviders bieden is die payment confirmation. Dit is een bericht dat van de betaalprovider naar de webwinkel gaat. Let op: Dit is voor de webwinkel dus een extra bericht. Met daarin het ordernummer en het daadwerkelijk betaalde bedrag van de klant. En dat bericht kun je als webwinkel uiteraard WEL vertrouwen. Omdat je weet waar dat bericht vandaan komt (IP adres van de provider op een afgesproken url bij jouw webwinkel).
Kortom hoe gaat het in zijn werk?
Klant is A
Webwinkel is B
Betaalafhandelaar C.
A bestelt iets bij B. Bijvoorbeeld een bestelling ABCDEFG voor 10 euro.
B stuurt aan A een 're-direct' terug zodat A naar C wordt gestuurd (met het bestelnummer ABCDEFG en het bedrag).
Hier zit het probleem, A kan het bedrag van 10 euro veranderen (naar 1 cent), maar de klant kan niet het ordernummer veranderen, want dat is de pizza en het adres waar die pizza heen moet.
A betaalt 1 cent bij C. De betaalactie slaagt (uiteraard), en via A (die 1 cent weer terugwijzigt naar 10 euro) komt dan de betaalbevestiging terug (bij de webwinkel).
Als webwinkel moet je die betaalbevestiging die van A ontvangt niet vertrouwen. Sommige webwinkels doen dit wel; da's niet erg handig. In elk geval heb je als webwinkel wel een betaalregistratie, maar je weet niet zeker of daadwerkelijk zoveel betaald is als je wilt hebben. Die klant A zegt wel 10 euro in zijn betaalbevestiging, maar in werkelijkheid -kan- het 1 cent zijn.
Nu het extraatje, de payment confirmation die van C naar B gaat.
Betaalprovider C biedt een extraatje. Als de klant 1 cent betaalt, stuurt die behalve het antwoord aan A, ook zelf een (tweede) bericht uit, namelijk naar de webwinkel. Nu weet de webwinkel dus dat er voor bestelling ABCDEFG 1 cent is betaald, of 10 euro als de klant niet heeft zitten frutselen aan het bedrag natuurlijk. En pas als de webwinkel dit tweede bericht ontvangt, weet de webwinkel dat de bestelling de deur uit kan!
Duidelijkste plaatje van dit tweede bericht dat ik zo snel kon vinden:
Ik hoop hiermee wat licht over de duisternis te hebben geschenen.
Groet,