PHP Academy · leksjon

SQL-injeksjon og parametriserte spørringer

Fjern injeksjonsrisiko ved alltid å bruke forberedte setninger med PDO.

Leksjon 2 av 413 trinn

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 credentials

Prepared 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 string

Lagrede 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å?

Gratis å komme i gang

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

  1. Forebygge cross-site scripting (XSS)
  2. SQL-injeksjon og parametriserte spørringer
  3. CSRF-beskyttelse
  4. Sikker lagring av passord
← Tilbake til PHP Academy