SQL injection korunması
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
-
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
-
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.
-
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 = ?");