SQL Programmering: Sikker programudvikling

Hvordan sikrer du, at din kode bliver sikker? Vi hjælper dig på vej.

Artikel top billede

(Foto: Computerworld)

Af Redaktionen, Alt om Data

Denne artikel er oprindeligt bragt på Alt om Data. Computerworld overtog i november 2022 Alt om Data. Du kan læse mere om overtagelsen her.

Vi har tidligere på disse sider skrevet om forskellige metodikker til, hvordan man kan udvikle sikker kode. Men vi er endnu ikke kommet med konkrete eksempler på, hvad sikker kode vil sige. Det råder vi bod på i denne samt en efterfølgende artikel.

I denne første del vil vi have fokus på SQL injection. Den næste artikel, som du kan læse i Alt om DATA nr. 4 2017, vil fokusere på de ting, man skal være opmærksom på, når man koder i f.eks. C/C++. Men vi starter som lovet med et kig på SQL injection og dennes sårbarheder.

Angreb med SQL injection

SQL injection er og har været i mange år en kernedel af en angribers våbenarsenal. Vi hører til stadighed om, at mange indbrud hos selv store virksomheder er baseret på et SQL injection-angreb. Men hvad er et SQL injection-angreb, og hvad består det af? Lad os starte med at kigge på et eksempel.

Tag et kig på figur 1.

Figur 1

Her har vi konstrueret en tekststreng, som har til formål at skulle bruges som en forespørgsel til databasen. Selve forespørgslen vil fungere, men hvis du kender til ASP.NET-programmering, så vil du lægge mærke til, at vi har brugt tekstværdierne fra input-boksene direkte i SQL-strengen. Det er en rigtig dårlig ide, da jeg ikke kan vide, hvad brugeren i den anden ende skriver ind i mine tekstbokse.

Hvis nu en snedig bruger skriver ’OR 0=0’, ind i de to tekstbokse, så vil min SQL-streng pludseligt se ud som på figur 2.

Figur 2

Nu har jeg pludselig en tekststreng, som vil logge brugeren ind uden et brugernavn eller et password, hvis den bliver eksekveret af en database.

Ved at skrive ’OR 0=0’ i tekstboksene, har brugeren lavet en tekststreng, som altid vil være sand, forstået på den måde, at når en database ser en option, der siger ’OR 0=0’, så ser den en option, der altid vil være sand. 0 er altid lig med 0, og ved at bruge ’OR’-option i SQL, så vil hele den del, der omhandler UserName og PassWord være sande.

Voila, en fuldstændig ukendt bruger er nu logget ind på systemet. Nu har vi brugt brugernavn og password i dette eksempel, men det samme gør sig gældende for alle andre SQL queries, som bliver opbygget dynamisk af systemet på baggrund af, hvad en bruger skriver i forskellige input-bokse.

Der findes et utal af forskellige SQL injection-sårbarheder ude på det grumme internet.

Jeg har vist, hvordan en bruger kan logge ind uden et brugernavn og et password, men der er andre måder en angriber kan forårsage kaos på et system, der har adgang til internettet.

Hvad siger du til et angreb, som sletter en eller flere af de tabeller, du har i din database? I dette tilfælde er der tale om et angreb, som kan udføres af en legitim bruger! Kig på figur 3.

Figur 3

Hvis en bruger skriver: ’110 ; DROP TABLE Payroll’, ind i tekstboksen, så vil vores SQL-streng pludseligt se ud som på figur 4.

Figur 4

Ved at bruge et semikolon efter UserID, så er min tekststreng pludselig blevet til en batch query.

En batch query vil sige, at den SQL, der er før semikolon, vil blive eksekveret først fulgt af den SQL, der kommer efter semikolon, og som sletter min Payroll tabel. Begge de situationer, vi har brugt som eksempler, er slemme. Som sagt findes der mange andre eksempler på SQL injections, og er du udvikler, så er det værd at sætte dig ind i de metoder, der står bag dem, så du kan beskytte din applikation imod dem.

Beskyttelse mod SQL injections

Men hvordan beskytter du imod dem? Validering, validering, validering. Validering alle vegne, på klienten, på serveren og hvis du også kan – på databaseserveren. Man kan selvfølgelig bruge et ORM-system, som f.eks. Entity Framework eller NHibernate på en Microsoft-platform, det vil skaffe langt de fleste SQL injections af vejen.

Der findes tilsvarende systemer til Java og mange andre programmeringssprog, så hvis du udvikler på en anden platform, så er det værd at undersøge, hvad mulighederne er for dit system! Det eksempel, vi her vil præsentere for at modvirke SQL injections, er baseret på .NET, simpelthen, da det er den platform, vi er mest kendt med. Eksemplet forudsætter, at man ikke har valgt at bruge Entity Framework eller en anden ORM-platform til at tilgå den underliggende database.

Vi har set, at det at bruge data direkte fra en tekstboks ikke er nogen god ide, og vi ved, at vi skal validere den data, der bliver returneret fra klienten til serveren. Eksemplet bruger SQL-parametre fra ADO.NET. Kig på figur 5.

Figur 5

Her har vi forvandlet UserID til et SQL-parameter i vores tekststreng. Ved at forvandle den til et SQL-parameter, kan vi specificere, hvad det er for en datatype, vi forventer, at den skal have, i dette tilfælde en integer datatype, altså et heltal.

Ved at gøre det på denne måde kan en bruger ikke længere skrive en tekststreng ind i inputfeltet, og ad den vej evt. slette en tabel, simpelthen fordi det vil fejle på databasen. Ved at bruge SQL-parametre kan du sikre dig, at det er de rigtige datatyper, der bliver sendt videre til databasen. Det står og falder naturligvis med, om databasen bruger disse datatyper i tabellerne.

Hvis det hele er sat op som tekststrenge, så er dette eksempel ikke en mulighed. Har du en database, hvor dette er situationen, så ville vi stærkt overveje, om ikke det var på sin plads at restrukturere den. Alt afhængig af hvordan man har valgt at strukturere koden i din virksomhed, så vil denne metode være vejen frem, eller I kan ændre jeres set-up til at bruge Store Procedures i stedet for. På den måde kan I flytte valideringen til databaseserveren. Det vigtige er, at man aldrig skal stole på det input, man får tilsendt fra klienten til serveren, og altid validere denne data. 

Læses lige nu
    Computerworld Events

    Vi samler hvert år mere end 6.000 deltagere på mere end 70 events for it-professionelle.

    Ekspertindsigt – Lyt til førende specialister og virksomheder, der deler viden om den nyeste teknologi og de bedste løsninger.
    Netværk – Mød beslutningstagere, kolleger og samarbejdspartnere på tværs af brancher.
    Praktisk viden – Få konkrete cases, værktøjer og inspiration, som du kan tage direkte med hjem i organisationen.
    Aktuelle tendenser – Bliv opdateret på de vigtigste dagsordener inden for cloud, sikkerhed, data, AI og digital forretning.

    Infrastruktur | Frederiksberg

    Roundtable: Hybrid og cloud – sikre og strategiske it-valg i en ustabil verden

    Eksklusive danske digitale ledere mødes til rundbordssamtale om balancen mellem fart, sikkerhed og compliance. Hør hvordan CIO’er bygger robuste hybrid cloud-strategier, der skaber reel forretningsværdi og styrker modstandskraften.

    Sikkerhed | København

    Strategisk It-sikkerhedsdag 2026 - København

    Få overblik over cybersikkerhedens vigtigste teknologier, trusler og strategiske valg. Hør skarpe oplæg om AI-risici, forsvar, compliance og governance. Vælg mellem to spor og styrk både indsigt og netværk. Deltag i København 20. januar.

    Andre events | København

    Executive Conversations: Fra hype til afkast – her er vinderne af AI-ræset

    Få et klart overblik over AI’s reelle effekt i danske virksomheder. Arrangementet giver unge talenter og ambitiøse medarbejdere viden, der løfter karrieren, skærper beslutninger og gør dig klar til at præge den digitale udvikling. Læs mere og...

    Se alle vores events inden for it

    Navnenyt fra it-Danmark

    Netip A/S har pr. 1. november 2025 ansat Laura Bøjer som Consultant, GRC & Cybersecurity på afd. Thisted. Hun kommer fra en stilling som Assistant Consultant hos PwC i Hellerup. Hun er uddannet med en kandidat i Business Administration & Information System på Copenhagen Business School. Nyt job

    Laura Bøjer

    Netip A/S

    Norriq Danmark A/S har pr. 1. oktober 2025 ansat Huy Duc Nguyen som Developer ERP. Han skal især beskæftige sig med at bidrage til at udvikle, bygge og skræddersy IT-løsninger, der skaber vækst og succes i vores kunders forretninger. Han kommer fra en stilling som Software Developer hos Navtilus. Han er uddannet i bioteknologi på Aalborg University. Nyt job

    Huy Duc Nguyen

    Norriq Danmark A/S

    Netip A/S har pr. 15. september 2025 ansat Jimmi Overgaard som Key Account Manager ved netIP's kontor i Viborg. Han kommer fra en stilling som Sales Executive hos Globalconnect A/S. Nyt job

    Jimmi Overgaard

    Netip A/S

    Sebastian Rübner-Petersen, 32 år, Juniorkonsulent hos Gammelbys, er pr. 1. september 2025 forfremmet til Kommunikationskonsulent. Han skal fremover især beskæftige sig med Projektledelse, kommunikationsstrategier og implementering af AI. Forfremmelse