Forsvar mod SQL-injektion
Forebyg injektionsangreb
Forsvar mod SQL-injektion er en gratis Cyber Security Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Cyber Security Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Cyber Security Academy-kurset indeholder 4 lektioner i alt.
Hvad er SQL-injektion
SQL-injektion (SQLi) opstår, når upålideligt brugerinput sammenkædes direkte med en SQL-forespørgsel. Angriberen sniger SQL-syntaks ind i et felt, som applikationen forventer indeholder almindelige data, og ændrer dermed forespørgslens betydning.
Det er stadig en af de mest skadelige sårbarheder i webapplikationer, fordi det kan lække hele databaser, omgå login eller ødelægge data.
En sårbar forespørgsel
Den klassiske fejl er strengsammenkædning. Hvis inputtet er tom, er forespørgslen i orden, men et manipuleret input omskriver logikken.
- Enkeltanførselstegnet lukker strengen før tid.
- Alt efterfølgende bliver eksekverbar SQL.
query = "SELECT * FROM users WHERE name = '" + userInput + "'";
// userInput = tom' OR '1'='1
// becomes: SELECT * FROM users WHERE name = 'tom' OR '1'='1'Omgåelse af autentifikation
Loginformularer er et oplagt mål. Ved at indsætte en betingelse, der altid er sand, og udkommentere resten kan en angriber logge ind uden en adgangskode.
Sekvensen -- udkommenterer den resterende del, så adgangskodekontrollen ignoreres.
-- attacker enters in the username field:
admin' --
-- resulting query:
SELECT * FROM users WHERE user = 'admin' --' AND pass = '...'Parametriserede forespørgsler
Det primære forsvar er parametriserede forespørgsler (forberedte forespørgsler). SQL-strukturen sendes separat fra dataene, så input altid behandles som en værdi og aldrig som kode.
Databasedriveren binder pladsholderen ? sikkert til de angivne værdier.
-- Python (sqlite3 / psycopg)
cur.execute(
'SELECT * FROM users WHERE name = ? AND pass = ?',
(username, password)
)Forberedte forespørgsler i Java
Alle større programmeringssprog understøtter parametrisering. I Java skal du bruge PreparedStatement i stedet for at opbygge strenge med Statement.
Bundne parametre kan ikke slippe ud af deres plads, så injektion er strukturelt umulig her.
PreparedStatement ps = conn.prepareStatement(
"SELECT * FROM users WHERE name = ?");
ps.setString(1, userInput);
ResultSet rs = ps.executeQuery();Lagrede procedurer
Lagrede procedurer kan være en hjælp, når de internt bruger parametriseret input. Men pas på: En lagret procedure, der opbygger dynamisk SQL ved hjælp af sammenkædning, er lige så sårbar.
- Sikkert: Parametre, der sendes til proceduren.
- Usikkert:
EXEC()med sammenkædede strenge inde i proceduren.
Validering af input og tilladelseslister
Validering er et nyttigt ekstra lag. Brug tilladelseslister (acceptér kun kendte, gyldige mønstre) i stedet for blokeringslister (forsøg på at forbyde ugyldige tegn).
Et numerisk ID-felt bør f.eks. afvise alt, der ikke består af cifre, før det overhovedet når forespørgslen.
if not user_id.isdigit():
raise ValueError('invalid id')
# only then use the valueEscaping er sidste udvej
Manuel escaping af anførselstegn er skrøbelig og fejlbehæftet. Forskellige databaser har forskellige regler for escaping, og særtilfælde som kodningstricks og andengangsinjektioner slipper igennem.
Foretræk parametriserede forespørgsler. Brug kun escaping, når en ORM eller driver ikke kan parametrisere en bestemt identifikator.
Mindst mulige privilegier for databasekonti
Begræns skaden ved en vellykket injektion ved at anvende mindst mulige privilegier på applikationens databasebruger.
- Giv kun
SELECT,INSERTogUPDATEpå de nødvendige tabeller. - Brug aldrig en superbruger/
root-konto til applikationen. - Afvis
DROP,FILEog administratorrettigheder.
GRANT SELECT, INSERT, UPDATE ON appdb.orders TO 'webapp'@'%';
REVOKE DROP, ALTER ON appdb.* FROM 'webapp'@'%';ORM'er og forespørgselsbyggere
Moderne ORM'er (Hibernate, Sequelize, Django ORM, SQLAlchemy) parametriserer som standard, hvilket fjerner det meste af risikoen for injektion.
Faren vender tilbage, når udviklere går over til rå SQL eller bruger strenginterpolation i en forespørgselsbygger. Send altid værdier som bundne parametre, også i rå tilstand.
Forsvar i dybden
Ingen enkelt sikkerhedsforanstaltning er nok. Kombinér flere lag:
- Parametriserede forespørgsler overalt (primært forsvar).
- Validering af input og tilladelseslister.
- Databasekonti med mindst mulige privilegier.
- En webapplikationsfirewall (WAF), der kan opdage kendte mønstre.
- Fejlbehandling, der aldrig lækker SQL eller stakspor.
Hurtigt tjek
Test din forståelse af det vigtigste forsvar.
Opsummering
Du har lært, hvordan SQL-injektion fungerer, og hvordan du stopper den:
- SQLi opstår, når upålideligt input sammenkædes med forespørgsler.
- Parametriserede forespørgsler er det primære forsvar.
- Tilføj validering med tilladelseslister, databasekonti med mindst mulige privilegier og en WAF.
- Undgå manuel escaping og dynamisk SQL i lagrede procedurer.
Forsvar i dybden forhindrer, at en enkelt fejl udvikler sig til et sikkerhedsbrud.
Lær Cyber Security Academy med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 76
- Lektioner
- 303
Ofte stillede spørgsmål
Er lektionen “Forsvar mod SQL-injektion” gratis?
Ja — alle 3 lektioner i læringssporet Cyber Security Academy, inklusive “Forsvar mod SQL-injektion”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Cyber Security Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Forsvar mod SQL-injektion”?
Forebyg injektionsangreb Du øver dig i Cyber Security Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Cyber Security Academy?
Der kræves ingen tidligere erfaring. Cyber Security Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.
Hvor lang tid tager lektionen “Forsvar mod SQL-injektion”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Cyber Security Academy-lektion?
Ja. Alle Cyber Security Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Forsvar mod SQL-injektion
- Adgangskontrol og kryptering
- Revision og overvågning
- Sikkerhed ved backup og gendannelse