Validering af kritiske inputfelter.
Gæsteindlæg skrevet af Casper Schneidereit for 1 decade siden | Se alle indlægFørst og fremmest så er det ikke min intention at hænge nogen ud, ikke mindst fordi jeg har lavet samme fejl. Endda mange gange. Men et konkret indlæg, bliver bare mere interessant når man kan koble det på et autentisk eksempel.
Sådan så min Amino Sponsorlink konto ud d. 29 februar 2012.02.28:
Til dem der ikke kender Amino Sponsorlink, så er det kort forklaret, en slags Adwords annoncering på Iværksætterportalen Amino, hvor du betaler for at have en annonce forskellige steder i debatten. Det kan se sådan her ud:
I skal ikke tage jer af den lyserøde baggrund der er på noget af teksten. Det er et browser plugin til Google Chrome, der markerer alle nofollow links på den måde.
Grunden til min konto rundede 3 millioner, skyldtes en fejl i systemet. Når man bestiller en annonce, skal man selvfølgelig tage stilling til hvad der skal stå i den. Overskrift, beskrivelse samt hvilken URL den skal linke til. Det næste punkt drejer sig om hvilke kategorier, samt hvilke placeringer i disse kategorier man ønsker annoncen vist. Udfra det bliver der så beregnet en pris per. Uge. På den efterfølgende side skal man så tage stilling til, hvor mange uger man ønsker ens annonce skal løbe. Man kan nøjes med en enkelt uge, men der er også lidt rabat at hente hvis man køber mellem 4 og 12 uger. Det var på denne side der var en fejl: Input valideringen ikke var restriktiv nok.
Negativ angivelse af antal uger
I tilfældet med Amino Sponsorlinks blevet parameteret "antal uger", valideret. Så vidt jeg kunne se blev der kontrolleret om det var et tal eller ej. Det er bare ikke nok til at undgå misbrug. Angav man et negativt antal uger, vil annoncens pris ligeledes ændre sig til en negativ værdi (at man har penge tilgode). Ved tryk på 'betal' troede systemet, at annoncen allerede var betalt, og satte det tilgodehavende ind på kontoen (forstået som min Amino Sponsorlinks interne konto). Selve annoncen blev dog ikke synlig. Det gjorde ikke noget, da man blot kunne foretage et nyt køb, dog uden at ændre uge parameteret til en negativ værdi. Prisen på den nye annonce, blev så fratrukket i kreditten fra hacket. Resultatet blev et styk online Amino Sponsorlink annonce.
Validering af input
Hele problematikken ligger altså i validering af parameteret "antal uger". Lad os prøve at køre den igennem. Valide input er farvet grønne, ikke valide er farvet røde.
Hvis vi validerer på om input er et tal, vil det give følgende resultater: en tekst, -3, 0,5, 3,45, 11, 9023.
Hvis vi udvider valideringen, kan vi sige input skal være lig med 1 eller større, men stadigvæk mindre eller lig med 12. Nu ser resultatet sådan her ud: tekst, -3, 0,5, 3,45, 11, 9023.
Vi ønsker dog kun at modtage heltal, så vores validering også tage højde for det. Vi vil derfor kun accepterer input der er lig med 1 eller større, men stadigvæk mindre end 13. Input skal være et heltal. Det betyder faktisk, der kun er 12 unikke input der vil være valide (alle heltal mellem 1 & 12) : tekst, -3, 0,5, 3,45, 11, 9023.
I PHP kan det laves på mange forskellige måder. Her jeg prøvet at bygge to funktioner, der kan løse opgaven:
Warning: highlight_file(phps/validering-ex-1.php): failed to open stream: No such file or directory in /home/www/xxxxxxx.dk/blog/hack-kredit.php on line 42
Warning: highlight_file(): Failed opening 'phps/validering-ex-1.php' for highlighting in /home/www/xxxxxxx.dk/blog/hack-kredit.php on line 42
Lad os prøve at smide funktionerne igennem en test:
Input | validering_antal_uger() | validering_og_korrektion_antal_uger() |
tekst |
Fatal error: Call to undefined function validering_antal_uger() in /home/www/xxxxxxx.dk/blog/hack-kredit.php on line 65 |