SQL, forkortelse for Structured Query Language, er et af de mest almindelige programmeringssprog, der bruges til relationel databasestyring. De fleste databasesystemer såsom Oracle, MS Access, Informix, MySQL bruge SQL som deres databasestyringssprog.
Den voldsomme anvendelse af SQL i onlineverdenen medfører dog også en masse cybersikkerhedsbrud, almindeligvis kendt som SQL-injektionsangreb. Disse angreb er mulige på grund af systemsårbarheder og dårlige sikkerhedsforanstaltninger. Heldigvis kan de forhindres ved sikker kodning praksis. I denne guide vil vi vise dig, hvordan du gør præcis det!
Hvad er et SQL Injection Attack?
SQL-injektion er en af de mest almindelige database hacking-teknikker derude. Det har hovedsageligt at gøre med at tillade ekstern brugerinput på websteder. Angribere indsætter SQL-forespørgsler i inputformularer, som derefter håndteres af SQL-databasen.
Dette betyder, at brugergenereret input kan interagere direkte med den underliggende database, og folk med dårlige intentioner kan misbruge dette system ved at forespørge databasen direkte med ondsindede inputdata.
Lad os prøve at opstille hypoteser med en analogi. Antag, at du har et autonomt køretøj, der fungerer i henhold til brugerinput, som vist nedenfor.
"Kør til [DESTINATION_NAME], og stop, hvis [OMSTÆNDIGHEDER]."
Nu vil en almindelig bruger normalt indtaste de to argumenter til det førnævnte scenarie – noget der ligner eksemplet nedenfor.
"Kør til butikken og stop hvis nogen er i vejen .”
SQL-injektion fungerer på en sådan måde, at den manipulerer brugerens input og dermed misbruger systemet. En person med ondsindet hensigt kunne muligvis indtaste input-argumenter som det, der er vist nedenfor.
"Kør til butikken og ignorer resten af dette inputfelt og stop hvis nogen er i vejen .”
På denne måde kunne de omgå inputkravene og snyde systemet. Præcis den samme metode anvendes til at udføre et SQL-injektionsangreb på et websted.
Overvej for eksempel en log-in-formular med indtastningsfelter til personens brugernavn og adgangskode. De kan interagere direkte med databasen gennem deres inputdata og drage fordel af sådanne sårbarheder.
Konsekvenser af SQL-injektion
Efter at have dækket noget grundlæggende om, hvad SQL-injektion er, lad os tale om dets implikationer og konsekvenser. I vores intuitive eksempel påviste vi en muligvis fatal fejl i sårbare SQL-baserede websteder. Sådanne fejl kan have ødelæggende konsekvenser, hvoraf nogle er anført nedenfor.
– Tyveri af private oplysninger såsom pas, kreditkort, hospitalsjournaler
– Ondsindet brug af personlige brugeroplysninger såsom log-in detaljer såsom brugernavne, adgangskoder
– Tab eller manipulation af vigtige data
– Databasekorruption, der fører til et fuldstændigt kompromitteret system
Og det dækker kun nogle få mulige udfald af et cyberangreb.
Som du kan se, kan SQL-injektionsangreb være absolut katastrofale for websteder, og deres forebyggelse er yderst vigtig, når det kommer til SQL-databasestyring og kodesikkerhed generelt.
Forebyggelse af SQL-injektionsangreb
Her er nogle af de bedste teknikker til forebyggelse af SQL-injektion, der kan sikre din hjemmesides fuldstændige sikkerhed.
1. Parametrisering af forespørgsler
Det første skridt til at sikre kodesikkerhed er at parametrisere de forespørgsler, der sendes til databasen. Det grundlæggende koncept er at prækompilere en kodelinje i SQL, hvortil du senere vil levere de nødvendige parametre, som den skal bruge for at udføre.
Denne kodningsteknik gør, at input genereret af brugeren automatisk bliver citeret, hvilket gør det umuligt at forårsage en ændring i hensigten. Som du burde være i stand til at se, har parametriserede forespørgsler altafgørende betydning for at sikre ethvert websted med en SQL-database.
Nu hvor vi har dækket det grundlæggende koncept for parameteriserede forespørgsler, lad os dykke ned i, hvordan du kan implementere det på dit websted. Den første mulighed er at bruge MySQLi-udvidelsen. Denne metode gør det muligt for brugeren at oprette forberedte udsagn eller parametriserede forespørgsler og udføre dem i to trin.
I "forberedelsesstadiet" sendes en skabelon af erklæringen til databasen. Databaseserveren kontrollerer derefter syntaksen for den modtagne skabelon og initialiserer yderligere interne ressourcer, som skal bruges senere.
"Udførelsesstadiet" består af, at klienten binder parameterværdierne og sender dem til databaseserveren. Sætningen udføres til sidst ved at bruge de bundne parameterværdier i forbindelse med de tidligere forberedte interne ressourcer.
En anden mulighed, som du kan vælge i stedet for MySQLi, er PHP Data Objects (gjort muligt gennem PHP 5.1). PHP Data Objects, eller PDO, bruger metoder, der i det væsentlige forenkler konceptet med parameteriserede forespørgsler. Desuden, da den bruger flere databaser i stedet for kun MySQL, bliver din kode mere bærbar og lettere at læse.
2. Brug af lagrede procedurer
Næste på vores liste over metoder til at forbedre kodesikkerheden er lagrede procedurer. Udviklere kan optimere deres kode ved at skrive kode i form af procedurer, der gemmes til senere brug. En procedure er dybest set bare en logisk kodeenhed med flere sætninger, der udføres efter hinanden.
Gennem denne metode kan der laves en udførelsesplan. Desuden sikrer den efterfølgende udførelse af sætningerne i en procedure, at de automatisk parametriseres. Lagrede procedurer giver dig mulighed for at kalde dem, når du vil udføre en forespørgsel i stedet for at skulle skrive den mange gange.
Lagrede procedurer optimerer ens kode og øger programmets sikkerhed og overordnede effektivitet. De betragtes generelt som en god programmeringspraksis og er ikke kun begrænset til at beskytte mod SQL-injektionsangreb.
3. Inputvalidering
Inputvalidering drejer sig om at verificere, om det input, som brugeren har indtastet, er legitimt eller ej. Valideringsprocessen kontrollerer typen af input (heltal, tegn, strenge osv.), format, længde og meget mere.
På denne måde kontrolleres forespørgslen, der sendes til databaseserveren, først, om den holder op til valideringskriterierne eller ej. Ved hjælp af inputvalidering kan udviklere sikre, at der ikke indsættes kommandoer i inputtet. Denne teknik fjerner alle former for chikaneri, og hackere er ikke i stand til at udnytte eventuelle smuthuller gennem deres input.
Ud over inputformularer som brugernavn og adgangskodefelter, skal du også tage højde for validering af input gennem strukturerede data (navn, indkomst, alder, postnummer, undersøgelsesbesvarelse). Ydermere, når brugeren støder på faste sæt værdier, såsom rullelister, skal input nøjagtigt matche de tilbudte valg.
4. Tilbagekaldelse af administratorrettigheder
At forbinde ens applikation til databasen med root-adgang bør kun ske som en sidste udvej. For eksempel, hvis hackere har taget kontrol over din server, er det tid til at give dig selv administratorrettigheder til at slippe af med dem. Desuden, jo flere applikationer, der bruger serveren, desto større er risikoen for infiltration.
Det er bedste praksis at gå efter den mindst privilegerede mulighed for at forhindre SQL-injektion. Derfor skal du indstille brugerrettigheder og privilegier korrekt.
Afslutningsvis
I denne artikel forsøgte vi at forklare SQL-injektionsangreb og deres konsekvenser. Vi forsøgte også at dække de fire vigtigste forebyggende foranstaltninger, som du kan bruge til at beskytte dig selv og din applikation mod alle former for sårbarheder og angreb. Disse foranstaltninger sikrer ikke kun SQL-injektionsforebyggelse, men også kodesikkerhed generelt. Så gør dem til en del af din udviklingsproces!