Cyber Security Academy · Lektion

Forsvar mod SQL-injektion

Forebyg injektionsangreb

Lektion 1 af 413 trin

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 value

Escaping 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, INSERT og UPDATE på de nødvendige tabeller.
  • Brug aldrig en superbruger/root-konto til applikationen.
  • Afvis DROP, FILE og 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.

Gratis at komme i gang

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

  1. Forsvar mod SQL-injektion
  2. Adgangskontrol og kryptering
  3. Revision og overvågning
  4. Sikkerhed ved backup og gendannelse
← Tilbage til Cyber Security Academy