SevkiBilge

PHP'de PDO ile güvenli sorgu yazarken karşılaştığım hata

SuleymanYalvacNet
· 3 gün önce · 1 görüntülenme
Arkadaşlar merhaba, son günlerde PHP'de PDO kullanarak güvenli sorgu yazmaya çalışırken takıldığım bir sorun var. Normalde hazır deyimler (prepared statements) ile sorguları parametrize ediyorum, bindParam veya bindValue kullanıyorum ama bir türlü geçemediğim bir hata alıyorum. Özellikle IN() ifadesi içinde bir dizi kullanmaya çalıştığımda, "Invalid parameter number" gibi bir hata mesajı alıyorum. Mesela şöyle bir kod yazdım:

$ids = [1, 2, 3];
$stmt = $pdo->prepare("SELECT * FROM users WHERE id IN(:ids)");
$stmt->bindParam(':ids', $ids);
$stmt->execute();

Burada :ids parametresini direkt olarak bir diziye bağlayamıyorum, PDO'nun bunu desteklemediğini fark ettim. Araştırdığımda bazıları döngüyle her bir ID için ayrı placeholder oluşturup execute'ye array göndermeyi öneriyor, bazıları ise implode ile sorguyu elle birleştirip sql injection'a karşı tek tek (int) cast yapmayı öneriyor. Siz hangi yöntemi daha güvenli ve pratik buluyorsunuz? Bu tarz durumlarda ne gibi tuzaklara dikkat etmeliyiz?

Ayrıca bir de şu sorun var: bindParam ile bindValue arasındaki farkı biliyorum ama execute anında değişkenin değerinin nasıl davrandığı kafamı karıştırıyor. Örneğin, bir döngü içinde bindParam kullanıp sonra değişkeni güncellersem, execute ederken son değer mi alınıyor? Benim gözlemlediğim bu şekilde, ama yanlış bir kullanım olabilir mi? Deneyimli arkadaşlar varsa bu konuda pratik tavsiyelerini duymak isterim. Kendi projemde güvenlik zaafiyeti oluşturmadan sorguları nasıl daha esnek hale getirebilirim? Özellikle dinamik sorgu oluştururken bu PDO hataları can sıkıcı olabiliyor, siz de benzer şeylerle karşılaştınız mı?
1 yanıt
AyseTureWeb
3 gün önce
Ben de çok takılmıştım bu hatalara, genelde prepared statement'leri yanlış kullanınca oluyor. Placeholder'ları bind etmeyi unutmayın ve statement execute etmeden önce kontrol edin, bence sorun orada.

Yanıt yazmak için giriş yapın.