Cyber Security Academy · Lektion

Skydd mot SQL-injektion

Förhindra injektionsattacker

Lektion 1 av 413 steg

Skydd mot SQL-injektion är en gratis lektion i Cyber Security Academy på CoddyKit. Detta är lektion 1 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Cyber Security Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Cyber Security Academy innehåller totalt 4 lektioner.

Vad är SQL-injektion

SQL-injektion (SQLi) uppstår när otillförlitlig användarinmatning sammanfogas direkt med en SQL-fråga. Angriparen smyger in SQL-syntax i ett fält som applikationen förväntar sig ska innehålla vanliga data, vilket ändrar frågans innebörd.

Det är fortfarande en av de mest skadliga sårbarheterna i webben, eftersom den kan läcka hela databaser, kringgå inloggningar eller förstöra data.

En sårbar fråga

Det klassiska misstaget är strängkonkatenering. Om inmatningen är tom är frågan korrekt, men en särskilt utformad inmatning skriver om logiken.

  • Det enkla citattecknet avslutar strängen för tidigt.
  • Allt därefter blir körbar SQL.
query = "SELECT * FROM users WHERE name = '" + userInput + "'";
// userInput = tom' OR '1'='1
// becomes: SELECT * FROM users WHERE name = 'tom' OR '1'='1'

Kringgå autentisering

Inloggningsformulär är ett vanligt mål. Genom att injicera ett villkor som alltid är sant och kommentera bort resten kan en angripare logga in utan lösenord.

Sekvensen -- kommenterar bort den återstående satsdelen, så att lösenordskontrollen ignoreras.

-- attacker enters in the username field:
admin' --
-- resulting query:
SELECT * FROM users WHERE user = 'admin' --' AND pass = '...'

Parameteriserade frågor

Det främsta skyddet är parameteriserade frågor (förberedda satser). SQL-strukturen skickas separat från datan, så att inmatningen alltid behandlas som ett värde och aldrig som kod.

Databasdrivrutinen binder platshållare som ? till de angivna värdena på ett säkert sätt.

-- Python (sqlite3 / psycopg)
cur.execute(
  'SELECT * FROM users WHERE name = ? AND pass = ?',
  (username, password)
)

Förberedda satser i Java

Alla större språk erbjuder parameterisering. I Java använder du PreparedStatement i stället för att bygga strängar med Statement.

Bundna parametrar kan inte ta sig ut ur sin plats, så injektion är strukturellt omöjlig här.

PreparedStatement ps = conn.prepareStatement(
  "SELECT * FROM users WHERE name = ?");
ps.setString(1, userInput);
ResultSet rs = ps.executeQuery();

Lagrade procedurer

Lagrade procedurer kan vara till hjälp när de använder parameteriserad indata internt. Men var uppmärksam: en lagrad procedur som bygger dynamisk SQL genom konkatenering är lika sårbar.

  • Säkert: parametrar som skickas till proceduren.
  • Osäkert: EXEC() med konkatenerade strängar inuti proceduren.

Indatavalidering och tillåtelselistor

Validering är ett användbart andra lager. Använd tillåtelselistor (acceptera endast kända, godkända mönster) i stället för blockeringslistor (försök att förbjuda felaktiga tecken).

Ett numeriskt ID-fält bör till exempel avvisa allt som inte består av siffror innan det någonsin når frågan.

if not user_id.isdigit():
    raise ValueError('invalid id')
# only then use the value

Escaping är sista utvägen

Att manuellt maskera citattecken är skört och felbenäget. Olika databaser har olika regler för escaping, och specialfall (kodningsknep och injektion i andra ledet) kan slinka igenom.

Föredra parameteriserade frågor. Använd escaping endast när ett ORM-ramverk eller en drivrutin inte kan parameterisera en viss identifierare.

Minsta privilegium för databaskonton

Begränsa skadan vid en lyckad injektion genom att tillämpa minsta privilegium för applikationens databasanvändare.

  • Ge endast SELECT, INSERT och UPDATE för de tabeller som behövs.
  • Använd aldrig ett superanvändar- eller root-konto för appen.
  • Neka DROP, FILE och administratörsbehörigheter.
GRANT SELECT, INSERT, UPDATE ON appdb.orders TO 'webapp'@'%';
REVOKE DROP, ALTER ON appdb.* FROM 'webapp'@'%';

ORM:er och frågebyggare

Moderna ORM:er (Hibernate, Sequelize, Django ORM, SQLAlchemy) parameteriserar som standard, vilket tar bort större delen av injektionsrisken.

Faran återkommer när utvecklare går över till rå SQL eller använder stränginterpolation i en frågebyggare. Skicka alltid värden som bundna parametrar, även i råläget.

Försvar i flera lager

Ingen enskild kontroll räcker. Kombinera flera lager:

  • Parameteriserade frågor överallt (det främsta skyddet).
  • Indatavalidering och tillåtelselistor.
  • Databaskonton med minsta privilegium.
  • En brandvägg för webbapplikationer (WAF) som fångar kända mönster.
  • Felhantering som aldrig läcker SQL eller stackspår.

Snabbtest

Testa din förståelse av det främsta skyddet.

Sammanfattning

Du har lärt dig hur SQL-injektion fungerar och hur den stoppas:

  • SQLi uppstår när otillförlitlig indata sammanfogas med frågor.
  • Parameteriserade frågor är det främsta skyddet.
  • Lägg till validering med tillåtelselistor, databaskonton med minsta privilegium och en WAF.
  • Undvik manuell escaping och dynamisk SQL inuti lagrade procedurer.

Försvar i flera lager hindrar ett enda misstag från att leda till ett dataintrång.

Gratis att börja

Lär dig Cyber Security Academy med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
76
Lektioner
303

Vanliga frågor

Är lektionen ”Skydd mot SQL-injektion” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Cyber Security Academy, inklusive ”Skydd mot SQL-injektion”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Cyber Security Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Skydd mot SQL-injektion”?

Förhindra injektionsattacker Ni övar på Cyber Security Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Cyber Security Academy?

Du behöver inga förkunskaper. Utbildningen i Cyber Security Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 1 av 4.

Hur lång tid tar lektionen ”Skydd mot SQL-injektion”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Cyber Security Academy-lektionen?

Ja. Varje Cyber Security Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Skydd mot SQL-injektion
  2. Åtkomstkontroll och kryptering
  3. Granskning och övervakning
  4. Säkerhet för säkerhetskopiering och återställning
← Tillbaka till Cyber Security Academy