CodeBlanks Logo Icon CodeBlanks

SQL injection korunması

PHP kursu · İleri seviye · Ders 62/92

Prepared statement ile SQL injection'a karşı korumayı pekiştirirsin.

SQL injection nedir?

Kullanıcıdan gelen veriyi doğrudan SQL dizesine eklersen saldırgan sorguyu değiştirebilir. Örneğin ' OR '1'='1 girdisi ile giriş formunu atlayabilir veya tabloyu silebilir. Buna SQL injection denir.

Korunma: SQL kodu ile veriyi ayır. prepare() sorguyu bir şablon olarak hazırlar; execute() parametreleri güvenle bağlar. PDO yer tutucuları (? veya :isim) asla SQL parçası olarak yorumlanmaz.

Hazırlanmış sorgu deseni

Güvenli bir sorgu üç adımda yazılır. Önce $stmt = $pdo->prepare("SELECT ... WHERE id = ?") ile şablonu hazırlarsın. Sonra $stmt->execute([$id]) ile değerleri bağlarsın; dizi sırası ? yer tutucularıyla eşleşir.

Sayısal girdiler için filter_var($input, FILTER_VALIDATE_INT) ile doğrulama yapabilirsin. Geçersiz girdide false döner; böylece hatalı veriyi erken yakalarsın. Sonra fetch(PDO::FETCH_ASSOC) ile satırı alırsın.

Uygulama Doğrula ve güvenle sorgula

$input değişkenini filter_var ve FILTER_VALIDATE_INT ile doğrula; sonucu $id'ye ata. Ardından prepare + execute([$id]) ile users tablosundan name sütununu çek; fetch(PDO::FETCH_ASSOC) ile satırı al ve name değerini yazdır.

Örnek çözümü göster
:FETCH_ASSOC); ile al, echo $row['name'] . "\n"; yazdır.
Örnek çözüm:
<?php
$pdo = new PDO("sqlite::memory:");
$pdo->exec("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)");
$pdo->exec("INSERT INTO users (name) VALUES ('Ayşe')");
$pdo->exec("INSERT INTO users (name) VALUES ('Ali')");
$input = "1";
$id = filter_var($input, FILTER_VALIDATE_INT);
$stmt = $pdo->prepare("SELECT name FROM users WHERE id = ?");
$stmt->execute([$id]);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
echo $row['name'] . "\n";

Kendini test et

  1. PDO güvenlik kavramlarını eşleştir

    prepare
    Sorguyu hazırlar
    execute
    Parametreleri bağlar
    ?
    Pozisyonel yer tutucu
    PDO::FETCH_ASSOC
    İlişkisel dizi döndürür
  2. Hangisi SQL injection'a karşı güvenlidir?

    • "SELECT * FROM u WHERE id = " . $input
    • str_replace ile tırnak silmek
    • prepare + execute([$id])
    • md5($input) ile şifrelemek
    Cevabı göster

    prepare + execute([$id]) — Doğru. prepare + execute veriyi SQL'den ayırır; enjeksiyon engellenir.

  3. prepare çağrısını tamamla

    $stmt = $pdo->____("SELECT name FROM users WHERE id = ?");
    Cevabı göster
    $stmt = $pdo->prepare("SELECT name FROM users WHERE id = ?");

İleri seviye bölümündeki tüm dersler