SQL-injeksjon og parametriserte spørringer
Fjern injeksjonsrisiko ved alltid å bruke forberedte setninger med PDO.
SQL-injeksjon og parametriserte spørringer er en gratis leksjon i PHP Academy på CoddyKit. Dette er leksjon 2 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i PHP Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i PHP Academy inneholder totalt 4 leksjoner.
Hva er SQL-injeksjon?
SQL-injeksjon oppstår når brukerleverte data bygges direkte inn i en SQL-spørring, slik at angripere kan manipulere spørringen for å få tilgang til, endre eller slette data.
Klassisk eksempel
Kjed sammen brukerdata med SQL:
<?php
// VULNERABLE: attacker enters username = "' OR '1'='1"
$sql = "SELECT * FROM users WHERE username = '".$_GET["username"]."'";
// Becomes: SELECT * FROM users WHERE username = '' OR '1'='1'
// Returns ALL users!Eksempel på dataeksfiltrering
En angriper bruker UNION SELECT til å lekke data fra andre tabeller.
// Input: ' UNION SELECT username, password FROM admin_users--
// This appends a second SELECT returning admin credentialsPrepared statements er løsningen
Med prepared statements er spørringsstrukturen fastlagt før data leveres. Databasen behandler alle bundne verdier som bokstavelige data — aldri som SQL-kode.
<?php
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$_GET["username"]]);
// Safe even if username = "' OR 1=1--"Navngitte plassholdere
Navngitte plassholdere er tydeligere, særlig når det finnes flere parametere.
<?php
$stmt = $pdo->prepare(
"SELECT * FROM users WHERE email = :email AND active = :active"
);
$stmt->execute([":email" => $email, ":active" => true]);Eloquent er som standard sikkert
Laravel Eloquent bruker internt PDO prepared statements for alle standardoperasjoner i spørringsbyggeren.
<?php
// Safe:
User::where("email", $email)->first();
// UNSAFE: raw query with user input!
DB::select("SELECT * FROM users WHERE email = ".$email);Råspørringer
Når De må bruke rå SQL i Laravel, må De alltid bruke parameterbindinger.
<?php
// Safe raw query:
$users = DB::select("SELECT * FROM users WHERE email = ?", [$email]);
// Or with named bindings:
$users = DB::select("SELECT * FROM users WHERE email = :email", [":email" => $email]);Injeksjon i LIKE-klausuler
LIKE-klausuler krever særskilt behandling — jokertegnene (%, _) må escapes manuelt før binding.
<?php
$search = str_replace(["%", "_", "\\"], ["\%", "\_", "\\\\"], $userInput);
$stmt = $pdo->prepare("SELECT * FROM products WHERE name LIKE ?");
$stmt->execute(["%$search%"]);Injeksjon i ORDER BY
Kolonnenavn og ORDER BY-retninger kan ikke parametriseres. Valider dem mot en tillatelsesliste.
<?php
$allowedColumns = ["name", "price", "created_at"];
$col = in_array($request->sort, $allowedColumns) ? $request->sort : "name";
$dir = $request->dir === "desc" ? "desc" : "asc";
// Then safely build the query stringLagrede prosedyrer
Lagrede prosedyrer kan også være sårbare hvis de setter sammen inndata internt. Bruk alltid parameteriserte kall.
Prinsippet om minste privilegium
Databasebrukeren som kobler til fra PHP, bør bare ha SELECT/INSERT/UPDATE/DELETE på nødvendige tabeller — aldri CREATE, DROP eller administratorprivilegier.
Sammendrag
Bruk ALLTID prepared statements med bundne parametere. Sett aldri brukerdata sammen med SQL. Valider ORDER BY og kolonnenavn mot en tillatelsesliste. Bruk PDO med deaktiverte emulerte prepared statements.
Hurtigsjekk
Hva er den riktige måten å beskytte seg mot SQL-injeksjon på?
Lær deg PHP med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 49
- Leksjoner
- 195
Ofte stilte spørsmål
Er leksjonen «SQL-injeksjon og parametriserte spørringer» gratis?
Ja – hele teksten i «SQL-injeksjon og parametriserte spørringer» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av PHP Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i PHP Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «SQL-injeksjon og parametriserte spørringer»?
Fjern injeksjonsrisiko ved alltid å bruke forberedte setninger med PDO. Du øver på PHP Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med PHP Academy?
Ingen tidligere erfaring er nødvendig. PHP Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 4.
Hvor lang tid tar leksjonen «SQL-injeksjon og parametriserte spørringer»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne PHP Academy-leksjonen?
Ja. Alle PHP Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Forebygge cross-site scripting (XSS)
- SQL-injeksjon og parametriserte spørringer
- CSRF-beskyttelse
- Sikker lagring av passord