19 Ekim 2026 - 03:15
SQL Injection Nedir ve Nasıl Korunulur? Görseli
Siber Güvenlik

SQL Injection Nedir ve Nasıl Korunulur?

0 Yorumlar

SQL injection, dışarıdan gelen bir değerin sorgunun verisi olmak yerine SQL yapısına karışmasıdır. Bir form alanından tek tırnakları silmek sorunu çözmez. Düzeltilecek yer, sorgunun nasıl oluşturulduğudur.

Değeri sorgu metnine birleştirmeyin

Aşağıdaki PDO örneği MySQL kullanır. products tablosunda id, name ve price sütunlarının bulunduğu varsayılmıştır. Bağlantı bilgilerini ortamdan veya web kökü dışındaki yapılandırmadan alın; kaynak koda gerçek parola yazmayın.

PHP
<?php
$id = filter_var($_GET['id'] ?? null, FILTER_VALIDATE_INT,
    ['options' => ['min_range' => 1]]);
if ($id === false || $id === null) {
    http_response_code(400);
    exit('Geçersiz ürün numarası.');
}

$pdo = new PDO(
    (string) getenv('DB_DSN'),
    (string) getenv('DB_USER'),
    (string) getenv('DB_PASSWORD'),
    [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
     PDO::ATTR_EMULATE_PREPARES => false]
);
$stmt = $pdo->prepare(
    'SELECT id, name, price FROM products WHERE id = :id'
);
$stmt->bindValue(':id', $id, PDO::PARAM_INT);
$stmt->execute();
$product = $stmt->fetch(PDO::FETCH_ASSOC);
if ($product === false) {
    http_response_code(404);
    exit('Ürün bulunamadı.');
}
echo htmlspecialchars($product['name'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');

MySQL DSN örneği mysql:host=127.0.0.1;dbname=app;charset=utf8mb4 biçimindedir. Sunucuda PDO MySQL sürücüsü bulunmalıdır. Üretimde hata ayrıntılarını kullanıcıya basmayın; uygulamanın hata işleyicisi sunucu tarafına kaydetsin ve genel bir hata yanıtı versin. Kayıtlara parolaları veya bütün form içeriğini dökmeyin.

Burada üç ayrı iş yapılır: ürün numarası doğrulanır, değer parametre olarak bağlanır, ürün adı HTML metni olarak kaçışlanır. htmlspecialchars SQL güvenliği sağlamaz; parametreli sorgu da her HTML çıktısını otomatik olarak güvenli yapmaz.

Sütun adı parametre olamaz

ORDER BY :column kullanıcının seçtiği sütunu güvenli biçimde seçme yöntemi değildir. Yer tutucular değer içindir. Sıralama seçeneğini uygulamanın tanımladığı sınırlı bir haritadan seçin:

PHP
<?php
// $pdo yukarıdaki güvenilir bağlantıdır.
$orders = [
    'newest' => 'id DESC',
    'price_low' => 'price ASC, id ASC',
    'price_high' => 'price DESC, id ASC',
];
$requested = $_GET['sort'] ?? 'newest';
if (!is_string($requested) || !isset($orders[$requested])) {
    http_response_code(400);
    exit('Geçersiz sıralama.');
}
$stmt = $pdo->query(
    'SELECT id, name, price FROM products ORDER BY ' . $orders[$requested] . ' LIMIT 20'
);
$products = $stmt->fetchAll(PDO::FETCH_ASSOC);

Sorguya eklenen parça kullanıcı metni değil, geliştiricinin yazdığı sabit ifadelerden biridir. Aynı sınır tablo adı, yön ve dinamik filtre operatörleri için de geçerlidir. Bir IN listesindeki bütün değerleri tek parametreye virgüllü metin olarak koymak yerine her değer için ayrı yer tutucu üretin.

Doğrulama ile temizlemeyi karıştırmayın

Bir kişinin soyadı O'Reilly olabilir. Kesme işaretini silmek veriyi bozarken sorgu tasarımındaki hatayı gizleyebilir. E-posta, sayı ve izin verilen seçenekleri iş kuralına göre doğrulayın. Genel bir metin temizleme filtresini SQL injection önlemi olarak sunmayın; eski FILTER_SANITIZE_STRING yaklaşımını yeni koda taşımayın.

Uygulama hesabına yalnızca ihtiyacı olan veritabanı yetkilerini verin. Şema değişiklikleri için kullanılan hesabı web uygulamasından ayırın. Bir WAF ek koruma olabilir, fakat hatalı sorguları düzeltmenin yerine geçmez. Giriş işlemlerinde de parola düz metin SQL karşılaştırmasıyla değil, uygun parola özeti doğrulamasıyla kontrol edilmelidir.

Düzeltmeyi küçük bir test veritabanında sınayın

Yalnızca yetkili olduğunuz test ortamında normal kimlik, sıfır, negatif sayı, eksik alan ve id[]=1 gibi beklenmeyen türleri deneyin. Metin alanında kesme işaretli adın bozulmadan saklandığını kontrol edin. Geçersiz sıralama seçeneğinin 400, bulunmayan ürünün 404 döndürmesi ve hiçbir yanıtın SQL hatası sızdırmaması beklenir.

Başvuru: PDO::prepare ve OWASP SQL injection önleme rehberi.

Benzer Yazılar

Yorumlar (0)

Henüz yorum yok. İlk yorum yapan sen ol!

Yorum Yap