Beskriv SQL-injektion
SQL-injektion er en almindelig metode, der bruges til databrud. Angrebet involverer tilføjelse af en SQL-kommando til et formularfelt i en web- eller applikationsfrontend, normalt via et websted, med den hensigt at bryde det originale SQL-script og udføre det injicerede SQL-script. Dette sker ofte, når dynamisk genereret SQL bruges i klientapplikationen. Den primære årsag til SQL-injektionsangreb er dårlig kodningspraksis i både klientapplikationen og databaselagrede procedurer. Mens mange udviklere anvender bedre praksis, er SQL-injektion fortsat et betydeligt problem på grund af udbredelsen af ældre applikationer og nyere applikationer bygget af udviklere, der ikke prioriterede SQL-injektionsforebyggelse.
Antag f.eks., at et frontend-webprogram opretter en dynamisk SQL-sætning på følgende måde:
SELECT * FROM Orders WHERE OrderId=25
Denne T-SQL oprettes, når brugeren går til salgsordrehistorikdelen af virksomhedens hjemmeside og indtaster 25 i formularfeltet for ordre-id-nummeret. Antag dog, at brugeren indtaster mere end blot et ID-nummer, for eksempel "25; SLET FRA ordrer;"
I så fald vil den forespørgsel, der sendes til din database, være som følger:
SELECT * FROM Orders WHERE OrderID=25; DELETE FROM Orders;
Den måde, forespørgslen i ovenstående eksempel fungerer på, er, at SQL-databasen får at vide via semikolonet ";", at sætningen er afsluttet, og at der er en anden sætning, der skal køres. Databasen behandler derefter den næste sætning som anvist, hvilket vil resultere i sletning af alle rækker fra tabellen Ordrer.
Den indledende SELECT forespørgsel køres som normalt, uden at der genereres fejl. Men når du ser på tabellen Ordrer, kan du ikke se nogen rækker. Den anden forespørgsel i batchen, som sletter alle rækkerne, blev også udført.
En teknik, der bruges til at forhindre SQL-injektionsangreb, er at inspicere teksten i parametrene eller værdierne, der er indtastet i formularfelterne, på udkig efter forskellige nøgleord. Denne løsning giver dog kun minimal beskyttelse, da der er mange, mange måder at tvinge disse angreb til at virke. Nogle af disse injektionsteknikker omfatter overførsel af binære data, at databasemotoren konverterer de binære data tilbage til en tekststreng og derefter udfører strengen.
Du kan køre følgende T-SQL-kode for at se et eksempel på dette scenarie.
DECLARE @v VARCHAR(255)
SELECT @v = cast(0x73705F68656C706462 AS VARCHAR(255))
EXEC (@v)
Når du accepterer data fra en bruger, uanset om det er en kunde eller en medarbejder, er det afgørende at validere, at inputtet matcher den forventede datatype for at forhindre SQL-injektionsangreb. Hvis der forventes et tal, skal klientprogrammet kontrollere, at inputtet faktisk er et tal. Hvis der forventes en tekststreng, skal du sikre dig, at den har den korrekte længde og ikke indeholder binære data. Klientprogrammet skal validere alle brugerinput. Validering kan udføres ved enten at informere brugeren om problemet og give dem mulighed for at rette det, eller ved at håndtere fejlen på en elegant måde for at sikre, at der ikke sendes kommandoer til databasen eller filsystemet.
Selvom rettelse af din applikationskode altid bør være prioritet, kan der være tilfælde, hvor det ikke er muligt. I sådanne tilfælde kan Advanced Threat Protection tilbyde et ekstra lag af sikkerhed for dine følsomme data.