Veiligheidsanalyse iDEAL Lite

Commentaren

Transcriptie

Veiligheidsanalyse iDEAL Lite
Rapport
Veiligheidsanalyse iDEAL Lite voorbeeldcode
Sijmen Ruwhof, 25 februari 2011
SR20091216: Veiligheidsanalyse iDEAL Lite voorbeeldcode
Inhoudsopgave
Inhoudsopgave .......................................................................................................... 2
1
2
3
4
Introductie............................................................................................................ 3
1.1
Samenvatting .................................................................................................. 3
1.2
Aanleiding ....................................................................................................... 3
1.3
Voorbeeldcode ................................................................................................. 3
Gevonden zwakheden ............................................................................................ 4
2.1
Orderform.php................................................................................................. 4
2.2
Idealtest.php ................................................................................................... 4
Verdieping ............................................................................................................ 5
3.1
Oorzaak .......................................................................................................... 5
3.2
Gevolg............................................................................................................ 5
3.3
Blootstelling .................................................................................................... 5
3.4
Aantallen ........................................................................................................ 5
3.5
Verantwoordelijkheid ........................................................................................ 6
Aanbeveling .......................................................................................................... 7
4.1
Aan de Nederlandse banken .............................................................................. 7
4.2
Aan webwinkels ............................................................................................... 7
5
Tijdlijn ................................................................................................................. 8
6
Conclusie............................................................................................................ 11
7
Referenties ......................................................................................................... 12
7.1
Publicaties..................................................................................................... 12
7.2
Gerelateerde onderzoeken .............................................................................. 12
Bijlage A: orderform.php ........................................................................................... 13
Bijlage B: idealtest.php ............................................................................................. 16
© 2009 - 2011 Sijmen Ruwhof
Versie: 25 februari 2011
Pagina 2 van 17
SR20091216: Veiligheidsanalyse iDEAL Lite voorbeeldcode
1
1.1
Introductie
Samenvatting
Programmeercode van Nederlandse banken voor het accepteren van iDEAL Lite betalingen
blijkt een groot aantal beveiligingslekken te bevatten. Het gaat hierbij wel om
voorbeeldcode, echter blijkt uit praktijkonderzoek dat webwinkels deze code wel degelijk
hebben geïmplementeerd en gebruiken in productieomgevingen.
1.2
Aanleiding
De zwakheden werden gevonden bij de ontwikkeling van een PrestaShop module waarin een
Rabobank iDEAL Lite implementatie werd uitgevoerd.
1.3
Voorbeeldcode
In de implementatiehandleiding van (Rabobank) iDEAL Lite worden een tweetal PHP scripts
meegeleverd: orderform.php en idealtest.php. Deze zijn bedoeld om te controleren of de
eigen webwinkel iDEAL betalingen kan ontvangen, voor softwareontwikkelaars om uit te
proberen hoe de koppeling met iDEAL precies in elkaar steekt en ter documentatie hiervan.
Wanneer echter wat kleine opmaakwijzigingen worden doorgevoerd en de variabelen hierin
op de juiste waarden worden gezet, dan kan deze voorbeeldcode ook daadwerkelijk ingezet
worden voor het verwerken van betalingstransacties.
© 2009 - 2011 Sijmen Ruwhof
Versie: 25 februari 2011
Pagina 3 van 17
SR20091216: Veiligheidsanalyse iDEAL Lite voorbeeldcode
2
Gevonden zwakheden
In de voorbeeldcode zijn drie zwakheden gevonden die in totaal 38 keer voorkomen. De
problemen variëren van het geven van teveel informatie over de configuratie van de
webserver, gevoelig zijn voor Denial-of-Service aanvallen, tot zelfs Cross Site Scripting
lekken. Met het laatstgenoemde is het daadwerkelijk mogelijk om mensen te misleiden bij
het doen van betalingen, de website te defacen en om accountgegevens van
webwinkelbeheerders te achterhalen.
2.1
Orderform.php
In orderform.php zijn de volgende zwakheden gevonden:



2.2
Path Disclosure en Username Enumeration op regelnummer 35, 42, 72, 72, 89, 95,
96, 97, 99, 101 en 115.
Denial-of-Service mogelijkheid op regelnummer 40 en 91.
Cross Site Scripting op regelnummer 72, 95, 96, 97, 99 en 101.
Idealtest.php
In idealtest.php zijn de volgende zwakheden gevonden:



Path Disclosure en Username Enumeration op regelnummer 19, 21, 28, 39, 58 en
81.
Denial-of-Service mogelijkheid op regelnummer 28, 58 en 81.
Cross Site Scripting op regelnummer 53, 58, 60, 61, 62, 72, 75, 84, 85 en 86.
© 2009 - 2011 Sijmen Ruwhof
Versie: 25 februari 2011
Pagina 4 van 17
SR20091216: Veiligheidsanalyse iDEAL Lite voorbeeldcode
3
Verdieping
3.1
Oorzaak
De vermoedens zijn dat:



3.2
De voorbeeldcode is geschreven door een junior PHP ontwikkelaar.
De voorbeeldcode nooit aan een beveiligingsaudit onderworpen is.
De Nederlandse banken zich niet verantwoordelijk voelden voor de gevolgen van de
één-op-één implementatie van deze voorbeeldcode.
Gevolg
Door via de bestandseigenschappen te controleren wanneer de twee bestanden voor het
laatst werden gewijzigd, werd geleerd dat het laatste geregistreerde onderhoud in mei 2006
was uitgevoerd. Hierdoor was het in december 2009 al 3,5 jaar mogelijk geweest om
webwinkels die deze software geïmplementeerd hadden, geheel over te nemen, te defacen
of zelfs offline te halen.
3.3
Blootstelling
Er hoeft op zich geen probleem te zijn wanneer de voorbeeldcode niet daadwerkelijk wordt
gebruikt. Echter, na wat speciaal geformuleerde zoektermen in Google te hebben ingevuld,
blijkt dat de code ook daadwerkelijk door sommige webwinkels wordt gebruikt. Hierdoor is
het eenvoudig geautomatiseerd te achterhalen welke webwinkels gebruik maken van deze
kwetsbare voorbeeldcode:


Google op: inurl:idealtest.php
Google op: inurl:orderform.php "Order formulier" Artikelnummer
Tevens had Currence een lijst beschikbaar gesteld, waarop alle 13.500 webwinkels staan die
een iDEAL abonnement hadden afgesloten. Op basis van deze lijst kon eenvoudig worden
vastgesteld met behulp van spidersoftware welke webwinkels de voorbeeldcode
daadwerkelijk gebruiken. In het najaar van 2010 heeft Currence besloten om deze lijst waarschijnlijk uit veiligheidsoverwegingen - van hun website te verwijderen en niet meer via
andere kanalen opvraagbaar te maken.
3.4
Aantallen
Het onderbouwde vermoeden heerst dat enkele honderden webwinkels de kwetsbare
voorbeeldcode hebben geïmplementeerd. Rond de 70 tot 100 kwetsbare webwinkels waren
in begin 2010 te achterhalen door onder andere speciale zoekopdrachten in zoekmachines
zoals Google in te vullen. Resultaten uit zoekmachines geven doorgaans maar het topje van
de ijsberg weer. Daarnaast worden op diverse fora op internet de voorbeeldcode besproken,
bestonden er onofficiële iDEAL Lite implementatiehandleidingen die hierop gebaseerd waren
en kan de code (nog) op enkele onofficiële plekken op internet vrijelijk worden gedownload.
© 2009 - 2011 Sijmen Ruwhof
Versie: 25 februari 2011
Pagina 5 van 17
SR20091216: Veiligheidsanalyse iDEAL Lite voorbeeldcode
3.5
Verantwoordelijkheid
Doordat het voorbeeldcode betreft waarin beveiligingslekken zitten, is het de vraag wie de
verantwoordelijkheid heeft met betrekking tot de beveiliging van de webwinkel wanneer
deze code één-op-één is geïmplementeerd. Aan de ene kant zijn de banken
verantwoordelijk voor het leveren van voorbeelden waarin wordt laten zien hoe een veilige
iDEAL Lite implementatie dient te worden uitgevoerd. Aan de andere kant hoort een
softwareontwikkelaar voorbeeldcode niet zomaar één-op-één te implementeren en is deze
verantwoordelijke voor de integrale veiligheid van de webwinkel.
© 2009 - 2011 Sijmen Ruwhof
Versie: 25 februari 2011
Pagina 6 van 17
SR20091216: Veiligheidsanalyse iDEAL Lite voorbeeldcode
4
Aanbeveling
4.1





4.2


Aan de Nederlandse banken
Zorg ervoor dat de gevonden beveiligingslekken worden verholpen door alle
gebruikersinvoer in de voorbeeldcode te controleren op het bevatten van de juiste
waarden.
Zorg dat een proces wordt geïmplementeerd, dat ervoor zorgt dat integraal op alle
programmeercode een periodieke beveiligingsaudit wordt uitgevoerd.
Neem door middel van een integrale nieuwsbrief contact op met alle webwinkels die
een iDEAL Lite abonnement afnemen en stel deze op de hoogte van het risico dat zij
lopen wanneer de kwetsbare voorbeeldcode is overgenomen.
Voer een uitgebreide controle uit naar webwinkels die de kwetsbare code
daadwerkelijk (gedeeltelijk) hebben overgenomen en stel deze hoogst persoonlijk op
de hoogte van het risico hiervan.
Zoek op internet naar websites waar de kwetsbare voorbeeldcode nog zonder
disclaimer wordt aangeboden ter download, of wordt besproken in onofficiële
handleidingen. Bied deze websites bijgewerkte voorbeeldcode aan die geen
zwakheden meer kent.
Aan webwinkels
Neem contact op met uw webwinkelleverancier en laat controleren of de
voorbeeldcode (gedeeltelijk) is overgenomen. Zo ja, dan zullen de zwakheden die
hierin zitten moeten worden verholpen.
Mocht de voorbeeldcode (in het verleden) zijn geïmplementeerd, dan zal via een kort
forensisch onderzoek moeten worden onderzocht of hiervan misbruik is gemaakt.
© 2009 - 2011 Sijmen Ruwhof
Versie: 25 februari 2011
Pagina 7 van 17
SR20091216: Veiligheidsanalyse iDEAL Lite voorbeeldcode
5
Tijdlijn
De relevante gebeurtenissen in chronologische volgorde:
Datum
Beschrijving
2009-11-24 : Beveiligingslekken in de voorbeeldcode van de iDEAL Lite implementatie
gevonden die door Rabobank Nederland ter beschikking werd gesteld.
2009-11-25 : De heer Van Dijk, procesmanager e-commerce bij Rabobank Nederland is
telefonisch benaderd over de gevonden zwakheden. Hij laat in een schriftelijke
reactie weten dat:
"[..] het ons bekend is dat de implementatievoorbeelden die we voor
iDEAL vanaf het begin gebruiken op bepaalde onderdelen niet helemaal
meer up to date zijn en dat besloten is om ze niet te vernieuwen omdat
iDEAL inmiddels zo wijd verbreid is dat er een brede expertise op dit
vlak is ontstaan en er meer dan genoeg werkende implementaties
geprogrammeerd zijn die wel zijn bijgehouden op wijzigingen in de
stand van de techniek. [..]"
In ander woorden: Van Dijk is bekend met tekortkomingen in de
voorbeeldcode. Tevens is Rabobank Nederland ook niet bereid om te
investeren in het verhelpen van de gevonden zwakheden.
2009-12-16 : Na bijna een maand niets meer van Rabobank Nederland te hebben vernomen
en tevens blijkt dat zij nog steeds geen enkele aanpassing hebben uitgevoerd
in de documentatie en voorbeeldcode, is besloten om de bevindingen te
publiceren en zodoende is contact gezocht met een journalist. Hiervoor is
gekozen:


Zodat webwinkelbeheerders op de hoogte worden gebracht van het
mogelijk risico dat zij lopen, aangezien Rabobank Nederland verzuimd
heeft om hierover te communiceren.
Tevens werd op deze manier Rabobank Nederland geforceerd om
serieus naar de problematiek te kijken en om oplossingen hiervoor aan
te dragen.
2009-12-17 : In een reactie laat woordvoerdster Verhaegh van Rabobank Nederland weten
dat het niet de bedoeling is dat de voorbeeldcode ook daadwerkelijk in de
praktijk wordt ingezet. Ze erkent dat dit niet duidelijk uit de handleiding naar
voren komt en is ook van plan om deze te laten aanpassen. Ook wordt de
belofte gedaan dat de leverancier van de broncode zal worden benaderd om
op de bevindingen te reageren. Zij moeten volgens Verhaegh de code
aanpassen. Verder meldt ze dat als het blijkt dat er echt fouten in de code
zitten, dat Rabobank Nederland de webwinkels via een nieuwsbrief op de
hoogte zal stellen.
2009-12-18 : Via WebWereld wordt het nieuws gepubliceerd.
2010-01
: Naar aanleiding van het nieuwsartikel verwijderd Rabobank Nederland de
mogelijkheid om de voorbeeldcode te downloaden. Tevens wordt de
documentatie gewijzigd:
"Indien u daarbij behoefte heeft aan een voorbeeld om te testen kunt u
© 2009 - 2011 Sijmen Ruwhof
Versie: 25 februari 2011
Pagina 8 van 17
SR20091216: Veiligheidsanalyse iDEAL Lite voorbeeldcode
Datum
Beschrijving
via een ticket in het iDEAL Dashboard vragen om toezending van
onderstaande twee PHP voorbeeldbestanden. Vergeet daarbij niet uw
e-mailadres te vermelden in het ticket. [..] LET OP: Deze
voorbeeldbestanden zijn niet bestemd om in productie te gebruiken."
Naast de toegevoegde disclaimer, wordt een extra barrière opgeworpen zodat
de voorbeeldcode moeilijker te verkrijgen zal zijn. Op zich een goede stap,
alleen het vermoeden is zeer groot - zeker na de beperking van de
beschikbaarheid van de code - dat de beveiligingslekken nog steeds in de
voorbeeldcode aanwezig zullen zijn. In die zin zijn de gevonden zwakheden
nog steeds niet verholpen.
2010-01-02 : Rabobank Nederland heeft nog steeds verzuimd om direct contact op te
nemen met getroffen webwinkels om deze in te lichten over het feit dat door
hun fout zij mogelijk gehackt kunnen worden. Secundity vond deze
onverantwoordelijke houding niet kunnen en heeft daarom het heft in eigen
hand genomen en gecontroleerd welke webwinkels daadwerkelijk de
voorbeeldcode één-op-één hadden overgenomen. Getroffen webwinkels zijn
hierover benaderd.
2010-09
: Ergens in het najaar van 2010 heeft Currence de lijst met alle 13.500
webwinkels van hun website verwijderd en is deze ook niet meer via andere
kanalen verkrijgbaar.
2011-02-20 : Dit volledige rapport met kenmerk SR20091216 is openbaar gemaakt en van
zijn vertrouwelijk karakter ontdaan. Het rapport is bijgewerkt met nieuwe
informatie die in de tussentijd bekend is geworden. Tot op heden is het
onbekend of Rabobank Nederland de melding van dit incident in een
nieuwsbrief naar buiten heeft gebracht, zoals zij had beloofd.
2011-02-21 : Een monitoringsdienst van Rabobank Nederland heeft gedetecteerd dat dit
rapport over iDEAL Lite gepubliceerd is. De heer Hafkamp, hoofd
risicomanagement bij Rabobank Nederland, heeft contact opgenomen om de
situatie op kantoor door te spreken.
2011-02-24 : Het overleg met Rabobank Nederland heeft plaatsgevonden. Hierin zijn een
aantal nieuwe feiten aan het licht gekomen:




Hoewel ze hierover niet naar buiten heeft gecommuniceerd, geeft
Rabobank Nederland aan dat ze een kortlopend onderzoek in 2009
heeft ingesteld, om te achterhalen hoeveel webwinkels de
voorbeeldcode daadwerkelijk hadden overgenomen. Doordat uit hun
onderzoek is gebleken dat er niet veel webwinkels zijn geweest die de
code hadden overgenomen, is besloten om geen contact te leggen met
webwinkels in de vorm van een nieuwsbrief.
Rabobank Nederland geeft aan dat deze in het vervolg
beveiligingsonderzoekers nu wél op de hoogte wil gaan houden van de
vervolgstappen die zij neemt na aanmelding van zwakheden in hun
betaalinfrastructuur.
De voorbeeldcode, die nu alleen via een ticket is op te vragen, schijnt
te zijn aangepast nadat de zwakheden hierin zijn ontdekt. Wat deze
aanpassingen precies zijn geweest, kon niet worden gezegd - dit wordt
opnieuw onderzocht.
Doordat dit rapport is gepubliceerd en hierin andere cijfers werden
genoemd van het aantal getroffen webwinkels, heeft Rabobank
© 2009 - 2011 Sijmen Ruwhof
Versie: 25 februari 2011
Pagina 9 van 17
SR20091216: Veiligheidsanalyse iDEAL Lite voorbeeldcode
Datum
Beschrijving
Nederland aangegeven nogmaals te willen onderzoeken welke
webwinkels de voorbeeldcode hebben overgenomen. Deze keer zullen
de getroffen webwinkels wel worden ingelicht wanneer deze de
kwetsbare code hebben geïmplementeerd.
 Rabobank Nederland geeft aan dat de voorbeeldcode door de
leverancier niet alleen aan hun is geleverd, maar ook aan alle andere
banken die zijn aangesloten op de iDEAL Lite infrastructuur. Elke bank
kon zelf bepalen of deze de voorbeeldcode aan klanten ter beschikking
wou stellen.
 In 2009 speelde Rabobank Nederland al met het idee om de
voorbeeldcode offline te halen, aangezien zij uit juridisch oogpunt geen
programmeercode aan klanten beschikbaar wou stellen. Naar
aanleiding van de gevonden zwakheden en uit dit juridisch oogpunt, is
in begin 2010 dan ook de voorbeeldcode verwijderd uit de
implementatiehandleiding.
Dit rapport is bijgewerkt met de bovenstaande nieuwe informatie, zodat een
zo correct mogelijke situatieschets wordt neergezet.
© 2009 - 2011 Sijmen Ruwhof
Versie: 25 februari 2011
Pagina 10 van 17
SR20091216: Veiligheidsanalyse iDEAL Lite voorbeeldcode
6
Conclusie
Samenvattend kan worden gesteld, dat:




De implementatie van een adequate beveiliging heeft geen enkele rol gespeeld bij
het opstellen van de voorbeeldcode voor de iDEAL Lite implementatie. Dit blijkt uit
de voorbeeldcode waarin op geen enkele wijze aan invoervalidatie wordt gedaan.
Doordat het evident is dat de voorbeeldcode niet aan een beveiligingsanalyse is
onderworpen, kan in algemene zin worden gesteld, dat het mogelijk is dat een klein
deel van de programmeercode dat onder beheer valt van de Nederlandse banken,
niet wordt gecontroleerd op beveiligingsrisico's.
Nederlandse banken ondermijnen, wanneer de voorbeeldcode ook daadwerkelijk
wordt geïmplementeerd, de beveiliging van tot dan toe goed beveiligde webwinkels.
Rabobank Nederland nam in december 2009 niet de verantwoordelijkheid voor wat
er was gebeurd met de door hun aangeboden voorbeeldcode. Dit blijkt uit het feit
dat Rabobank Nederland het niet nodig achtte om getroffen webwinkels in te lichten
of hierover een algemene nieuwsbrief te versturen.
© 2009 - 2011 Sijmen Ruwhof
Versie: 25 februari 2011
Pagina 11 van 17
SR20091216: Veiligheidsanalyse iDEAL Lite voorbeeldcode
7
Referenties
7.1
Publicaties
Het nieuwsartikel is door WebWereld voor het eerst gepubliceerd. Daarna hebben een aantal
websites dit bericht overgenomen:







BeveiligingsNieuws.nl
DigitalLife.nl
DataChecker.nl
Nucia.eu
HackInfo.nl
BeveiligingNieuws.nl
PCWebPlus.nl
Op een aantal plekken op internet is gediscussieerd over deze materie:



7.2
WebWereld.nl
PFZ.nl
Security.nl
Gerelateerde onderzoeken
iDEAL gerelateerde veiligheidsonderzoeken:



2009-11-16 door Networking4all: Aantal onveilige 'iDEAL-webwinkels' groeit
explosief
2010-03-12 door WebWereld: Bug in iDeal Rabobank toont spooktransacties
2010-12-29 door Networking4all: 'iDEAL webwinkels' nemen wetgeving niet serieus
© 2009 - 2011 Sijmen Ruwhof
Versie: 25 februari 2011
Pagina 12 van 17
SR20091216: Veiligheidsanalyse iDEAL Lite voorbeeldcode
Bijlage A: orderform.php
1
<html>
2
<head>
3
<title>Testshop</title>
4
<font face=""></font>
5
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
6
7
<script language="JavaScript" type="text/JavaScript">
8
9
//Returns Number with 2 decimals
10
function Format(Number)
11
{
12
Number = Math.round(Number*100)/100;
13
var NumberText = Number + '';
14
if((Number) == Math.round(Number))
15
{
16
//No decimals? Add .00
17
NumberText += ".00";
18
}
19
else if((Number*10) == Math.round(Number*10))
20
{
21
//If 1 decimal only, add 0
22
NumberText += "0";
23
}
24
25
return NumberText;
}
26
27
28
//Updates totals in form
29
function Update(Number, Price, TotalPrice)
30
{
31
TotalPrice.value = Format(Price.value * Number.value);
32
33
<?php
34
35
$num_of_rows = 1 + $_GET['num'];
36
$part1 = "parseFloat(document.forms[0].Product";
37
$part2 = "TotalPrice.value)";
38
$plusSign = "+";
39
40
for($x=1; $x<=$num_of_rows; $x++)
41
{
42
$JSstring = "$JSstring" . "$part1" . "$x" . "$part2";
43
if ($num_of_rows>1 && $x!=$num_of_rows) {
44
$JSstring = "$JSstring" . "$plusSign";
45
46
47
48
}
}
echo 'var Total='.$JSstring.';'
?>
49
50
document.forms[0].grandtotal.value = Format(Total);
© 2009 - 2011 Sijmen Ruwhof
Versie: 25 februari 2011
Pagina 13 van 17
SR20091216: Veiligheidsanalyse iDEAL Lite voorbeeldcode
51
if(Total > 0)
52
{
53
document.forms[0].Submit.disabled = false;
54
}
55
else
56
{
57
document.forms[0].Submit.disabled = true;
58
}
59
}
60
</script>
61
</head>
62
63
<body>
64
65
<b>Order formulier</b>
66
<br /><br />
67
68
<form action="idealtest.php" method="post" name="payment">
69
<table width="30%">
70
<tr>
71
72
<td align="left"><strong>Ordernummer:</strong> </td>
<td><input name="ordernumber" type="text" size="18" maxlength="16" title="Betaalkenmerk van de iDEAL transactie, AN..max 16"
value="<?php echo''.$_POST[ordernumber].''; ?>"> </td>
73
</tr>
74
</table>
75
<br /><br />
76
77
<table border="1">
78
<tr align="left">
79
<th>Omschrijving</th>
80
<th>Artikelnummer</th>
81
<th>Aantal</th>
82
<th>&nbsp;</th>
83
<th>Prijs</th>
84
<th>&nbsp;</th>
85
<th>Totaal</th>
86
</tr>
87
<?php
88
89
$num_of_rows = 1 + $_GET['num'];
90
91
for($x=1; $x<=$num_of_rows; $x++)
92
{
93
echo '
94
<tr>
95
<td><input name="Product'.$x.'" type="text" size="32" maxlength="32" VALUE="'.$_POST['Product' . $x].'" title="Beschrijving van pr
oduct, AN..max 32"></td>
96
<td><input name="Articleno'.$x.'" type="text" VALUE="'.$_POST['Articleno' .$x].'" size="15" maxlength="15" title="AN..max 12"></
td>
97
<td><input name="Product'.$x.'Number" type="text" VALUE="'.$_POST['Product' .$x .'Number'].'" size="3" maxlength="3" onKeyUp
="Update(Product'.$x.'Number,Product'.$x.'Price,Product'.$x.'TotalPrice)"></td>
98
99
<td>x</td>
<td><input name="Product'.$x.'Price" type="text" VALUE="'.$_POST['Product' .$x. 'Price'].'" onKeyUp="Update(Product'.$x.'Number,
Product'.$x.'Price,Product'.$x.'TotalPrice)" size="7"></td>
© 2009 - 2011 Sijmen Ruwhof
Versie: 25 februari 2011
Pagina 14 van 17
SR20091216: Veiligheidsanalyse iDEAL Lite voorbeeldcode
100
101
<td>=</td>
<td><input name="Product'.$x.'TotalPrice" type="text" VALUE="'.$_POST['Product' .$x. 'TotalPrice'].'" size="7" maxlength="7" reado
nly="true"></td>
102
</tr>';
103 }
104
?>
105
106
</table>
107 <br />
108 <br />
109 <br />
110 <table>
111
<tr>
112
113
<td align="right"><input name="Reset" type="reset" value="Reset" onClick="document.forms[0].Submit.disabled=true"></td>
114
<td align="right"><input name="Submit" type="submit" value="artikel toevoegen"
115
116
117
onClick="document.payment.action='orderform.php?num=<?php $_GET['num']=$_GET['num']+1; echo''.$_GET['num'].'';?
>';"></td>
<td align="right"><input name="Submit" type="submit" value="artikel verwijderen"
onClick="document.payment.action='orderform.php?num=<?php $_GET['num']=$_GET['num']2; echo''.$_GET['num'].'';?>';"></td>
118
<td align="right"><input name="Submit" type="submit" value="Bestel"></td>
119
<td align="right"><strong>Totaalbedrag:</strong></td>
120
<td align="right"><input name="grandtotal" type="text" readonly="true" value="0.00" size="7" maxlength="7"></td>
121
</tr>
122
</table>
123 <input name="numberOfRows" type="hidden" value="<?php echo''.$num_of_rows.''; ?>">
124 </form>
125
126 </body>
127 </html>
128
129
© 2009 - 2011 Sijmen Ruwhof
Versie: 25 februari 2011
Pagina 15 van 17
SR20091216: Veiligheidsanalyse iDEAL Lite voorbeeldcode
Bijlage B: idealtest.php
1
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2
<html>
3
<head>
4
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
5
</head>
6
<body>
7
<?php
8
9
### is gelijk aan 'Sleutel', zie uw dashboard onder tabblad "Certificaat uploaden"
10 $key = "xxxxxxxxxxxxxx";
11
12 ### is gelijk aan 'Acceptant ID', zie uw dashboard onder tabblad "Gegevens Acceptant"
13 $merchantID = "xxxxxxxxxx";
14
15 ### subID niet wijzigen ###
16 $subID = "0";
17
18 ### bedrag moet geconverteerd worden naar eurocenten ###
19 $amount = $_POST['grandtotal']*100;
20
21 $orderNumber = $_POST['ordernumber'];
22 $paymentType = "ideal";
23
24 ### De geldigheid van de aanbieding zetten we in dit voorbeeld op een week ###
25 $validUntil = date("Y-m-d\TG:i:s\Z",strtotime ("+1 week"));
26
27 ### Toon de bestellijst ###
28 for($i=1;$i<=$_POST['numberOfRows'] ;$i++) {
29
${itemNumber.$i} = $_POST['Articleno' . $i];
30
${itemDescription.$i} = $_POST['Product' . $i];
31
${product.$i.number} = $_POST['Product' .$i. 'Number'];
32
${product.$i.price} = $_POST['Product' .$i. 'Price']*100;
33 ### bereken alvast een deel van de SHA string ###
34
35
$partOfSha = $partOfSha . ${itemNumber.$i} . ${itemDescription.$i} . ${product.$i.number} . ${product.$i.price};
}
36
37
38 ### bouw de String op waarover een SHA1 moet worden berekend ###
39 $shastring = "$key" . "$merchantID" . "$subID" . "$amount" . "$orderNumber" . "$paymentType" . "$validUntil" . $partOfSha ;
40
41 ###speciale HTML entiteiten verwijderen:
42 $clean_shaString = HTML_entity_decode($shastring);
43
44 ### De tekens "\t", "\n", "\r", " " (spaties) mogen niet voorkomen in de string
45
46 $not_allowed = array("\t", "\n", "\r", " ");
47 $clean_shaString = str_replace($not_allowed, "",$clean_shaString);
48
49 $shasign = sha1($clean_shaString);
50
© 2009 - 2011 Sijmen Ruwhof
Versie: 25 februari 2011
Pagina 16 van 17
SR20091216: Veiligheidsanalyse iDEAL Lite voorbeeldcode
51 ?>
52 Totaal bedrag van de transactie in eurocenten:<?php print $amount ?><br />
53 Betalingskenmerk: <?php print $orderNumber ?><br />
54 Hash: <?php print $shasign ?><br />
55 <br />
56 Overzicht van de bestelling:<br /><br />
57 <?php
58 for($i=1;$i<=$_POST['numberOfRows'] ;$i++)
59 {
60
print 'Artikelnummer:'.${itemNumber.$i}.'<br />';
61
print 'Omschrijving:'.${itemDescription.$i}.'<br />';
62
print 'Aantal:'.${product.$i.number}.'<br />';
63
print 'Prijs:'.${product.$i.price}.'<br /><br />';
64 }
65 ?>
66
67 <FORM METHOD="post" ACTION="https://idealtest.rabobank.nl/ideal/mpiPayInitRabo.do" id=form1 name=form1>
68 <INPUT type="hidden" NAME="merchantID" value="<?php print $merchantID ?>">
69 <INPUT type="hidden" NAME="subID" value="<?php print $subID ?>">
70
71 <INPUT type="hidden" NAME="amount" VALUE="<?php print $amount ?>" >
72 <INPUT type="hidden" NAME="purchaseID" VALUE="<?php print $orderNumber ?>">
73 <INPUT type="hidden" NAME="language" VALUE="nl">
74 <INPUT type="hidden" NAME="currency" VALUE="EUR">
75 <INPUT type="hidden" NAME="description" VALUE="Bestelling: <?php print $orderNumber ?>">
76 <INPUT type="hidden" NAME="hash" size="50" VALUE="<?php print $shasign ?>">
77 <INPUT type="hidden" NAME="paymentType" VALUE="ideal">
78 <INPUT type="hidden" NAME="validUntil" VALUE="<?php print $validUntil ?>">
79
80 <?php
81 for($i=1;$i<=$_POST['numberOfRows'] ;$i++)
82 {
83
echo '
84
<INPUT type="hidden" NAME="itemNumber'.$i.'" VALUE="'.${itemNumber.$i}.'">
85
<INPUT type="hidden" NAME="itemDescription'.$i.'" VALUE="'.${itemDescription.$i}.'">
86
<INPUT type="hidden" NAME="itemQuantity'.$i.'" VALUE="'.${product.$i.number}.'">
87
<INPUT type="hidden" NAME="itemPrice'.$i.'" VALUE="'.${product.$i.price}.'">';
88 }
89 ?>
90
91 <INPUT type="hidden" NAME="urlCancel" VALUE="http://www.domeinnaam.ext/betaling-afgebroken.html">
92 <INPUT type="hidden" NAME="urlSuccess" VALUE="http://www.domeinnaam.ext /betaling-gelukt.html">
93 <INPUT type="hidden" NAME="urlError" VALUE="http://www.domeinnaam.ext /betaling-error.html">
94
95 <INPUT name="Submit" type="submit" value="Betaal met iDEAL">
96 </form>
97 </body>
98 </html>
99
100
© 2009 - 2011 Sijmen Ruwhof
Versie: 25 februari 2011
Pagina 17 van 17

Vergelijkbare documenten