08 oktober 2008

Tänk vad en apostrof kan ställa till med mycket problem

Jag har kort beskrivit vikariekalendern. Det är ett webbgränssnitt där vikarierna har möjlighet att ange vilka tider de kan arbeta så att vikarieförmedlingen vet vilka vikarier som är lediga inför ett vikariat. Sedan jag började med den i våras så har det växt till sig ordentligt. Nu är det 500 vikarier som använder sig av mitt webbprogram, 400 i Kalmar och 100 i Sala kommun.

Det har uppstått lite småbuggar hela tiden, men aldrig något så allvarligt som det som inträffade igår. Jag ser heller inte riktigt vad jag kunde ha gjort för att förhindra det. Det var först när den 500:e valde ett lösenord uppstod felet som gjorde att hela databasen krasha. Jag ska försöka förklara.


Jag har en SQL-fråga som skriver in lösenord och e-postadress i databasen:

Update Persontabell Set Password = '$php_variable' Where Personnummer = $persnr;

För att sql ska veta att lösenordet är en textsträng (och inte en siffra) är det apostrofer runt omkring det. Men om lösenordet innehåller en apostrof så tror programmet att strängen är slut där. Så långt genererar bara applikationen ett fel, säger att SQL-frågan blir fel. Men på något sätt lyckades sätt lyckades en användare välja ett lösenord som inte bara avslutade den strängen utan hela frågan. Så att Where-delen faller bort. Frågan blir då:

Update Persontabell Set Password= '$php_variable'

Den frågan sätter ALLA lösenord i hela databasen till värdet på PHP-variablen. 400 användare i vikariekalendern i Kalmar som börjar skicka e-post om att de inte kan logga in = massa jobb för mig och många samtal till handläggarna i Kalmar. Som tur var fanns det backup av databasen så att jag kunde återställa 370 personer. Fast det tog en dags arbete och en hel del trixande med utvinnande av data ur databasen, för att bara få med rätt data.

Nu hoppas jag verkligen att felet är åtgärdat. Folk brukar ju vanligen inte ha apostroftecken i sina lösenord, men jag använder en krypterad version av lösenordet, eftersom jag inte vill skriva lösenorden rakt ut i databasen - och då kan det bli vilka tecken som helst. Det enda jag gjorde var att om lösenordet innehåller en apostrof, så översätter jag det till två apostroftecken. SQL-språket har inbyggt att det tolkar om det till en apostrof inne i strängen. På så sätt är det omöjligt att avsluta strängen innan variabelsträngen slutar (hoppas jag iaf). Tänk vad en apostrof kan ställa till med mycket problem.

Inga kommentarer: