Konuyu Açan
#1
Giriş
Dinamik SQL oluşturma, esneklik sağlasa da hataya açık bir alandır. Özellikle değişkenlerin nerede ve nasıl kullanıldığı, hangi değerlerin nereye geçirildiği konusunda dikkatli olunmazsa güvenlik açıkları ve mantık hataları riski artar. Aşağıda, benim gördüğüm ortak hata kalıpları ve bunları nasıl önleyebileceğinize dair net ipuçları yer alıyor.
1) SQL enjeksiyonu risklerini ihmal etmek
[list]
SELECT * FROM users WHERE username = '$username' AND status = '$status'
KOD
123$stmt = $pdo->prepare('SELECT * FROM users WHERE username = :u AND status = :s');
[/list]
$stmt->execute([':u'=>$username, ':s'=>$status]);2) Sorgu parçalarını yanlış birleştirmek
- Dinamik alan adları veya sıralama kriterleri için güvenlik açığı doğabilir. Örneğin ORDER BY veya LIMIT değerlerini doğrudan kullanıcıdan almak risklidir.
- Çözüm: tablolar ve kolon adlarını whitelist ile sınırlandırın; dinamik değerler için bound parametre kullanın, ancak kolon/tabloları doğrudan bağlamayın. KOD
1
$columns = ['name','email','created_at']; if(!in_array($sortCol,$columns)) $sortCol = 'name';
3) Hatalı veya eksik bağlama
[list]
KOD
123$stmt = $pdo->prepare('SELECT * FROM orders WHERE amount > :min AND created_at >= :since');
[/list]
$stmt->execute([':min'=>$minAmount, ':since'=>$sinceDate]);4) Datayı aşırı zincirleştirmek
- Çok sayıda dinamikleştirme adımı, okunabilirliği ve bakımı azaltır; özellikle kullanıcı girdisine göre SQL üzerinde dalga dalga değişen yapılar hata yüzdesini artırır.
- Çözüm: mantığı küçük, değiştirilebilir parçalara bölün; mümkünse ORM veya etkili bir query builder kullanın.
5) Hata yönetimini yetersiz yapmak
- Sorgu başarısız olduğunda ne olduğunun izlenmesi zorlaşabilir. Hataları loglamak ve kullanıcıya güvenli mesaj sunmak gerekir.
- Çözüm: hata try-catch ile yakalanmalı, hata mesajları üretim ortamında kullanıcıya gösterilmemeli; loglar detaylı olarak tutulmalı.
Siz hangi senaryolarda dinamik SQL kullanıyorsunuz? Özellikle güvenlik ve performans açısından karşılaştığınız en kritik hata nedir?
