Prepared Statements Nedir ?
Prepared statements'ın temel bileşenleri şunlardır:
- Hazırlık Aşaması (Preparation): Sorgu, veritabanı sunucusuna gönderilmeden önce hazırlanır ve derlenir. Bu aşamada sorgunun genel yapısı belirlenir ve yerine konulacak parametreler için yer ayrılır.
- Parametre Yerleştirme (Binding Parameters): Sorgu hazırlandığında, sorguya verileri sağlamak için parametreler belirlenir. Parametreler, kullanıcının giriş verileri veya uygulamanın dinamik verileri olabilir.
- Sorgu Çalıştırma (Execution): Sorgu, parametreler yerleştirilerek veritabanı sunucusuna gönderilir ve orada derlenir. Bu aşamada veritabanı sorgusu parametrelerle birleştirilir ve çalıştırılır.
- Güvenlik: Prepared statements, SQL enjeksiyonu saldırılarını engellemeye yardımcı olur. Parametreler veritabanı sunucusuna ayrı sorgu olarak iletilir, bu nedenle saldırganın veriyi manipüle etmesi daha zorlaşır.
- Performans: Sorgu hazırlandığında ve derlendiğinde, veritabanı sunucusu bu sorguyu bir kez derler. Ardından sorguyu parametrelerle birleştirerek çalıştırabilir. Bu, aynı sorgunun birden çok kez çalıştırılması durumunda performans avantajı sağlar.
- Karmaşıklığı Azaltma: Sorgu oluşturma aşaması ve parametre yerleştirme aşaması birbirinden ayrıdır. Bu, dinamik sorgular oluştururken karmaşıklığı azaltır.
Kod:
$stmt = $connection->prepare("SELECT * FROM users WHERE username = ?");
$username = "john";
$stmt->execute([$username]);
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
Bu örnekte, prepare() metodu sorguyu hazırlar, execute() metodu parametreleri yerleştirerek sorguyu çalıştırır. Parametreler yerine otomatik olarak doğru şekilde yerleştirilirken, güvenlik açısından da koruma sağlanmış olur.
Örneklerine Bakalım
1.Veri Ekleme:
Kod:
// Kullanıcıdan alınan veriler
$username = $_POST['username'];
$email = $_POST['email'];
// Hazır ifade kullanımı
$stmt = $connection->prepare("INSERT INTO users (username, email) VALUES (?, ?)");
$stmt->execute([$username, $email]);
2.Veri Güncelleme:
Kod:
// Kullanıcı tarafından verilen veri
$newEmail = $_POST['new_email'];
$userId = $_POST['user_id'];
// Hazır ifade kullanımı
$stmt = $connection->prepare("UPDATE users SET email = ? WHERE id = ?");
$stmt->execute([$newEmail, $userId]);
3.Veri Sorgulama ve Sonuç Alma:
Kod:
// Kullanıcı tarafından verilen veri
$username = $_POST['username'];
// Hazır ifade kullanımı
$stmt = $connection->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$username]);
// Sonuçları alma
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
4.Çoklu Parametreler:
Kod:
// Kullanıcı tarafından verilen veri
$firstName = $_POST['first_name'];
$lastName = $_POST['last_name'];
$age = $_POST['age'];
// Hazır ifade kullanımı
$stmt = $connection->prepare("INSERT INTO profiles (first_name, last_name, age) VALUES (?, ?, ?)");
$stmt->execute([$firstName, $lastName, $age]);
5.Parametre Türleri ve Veritabanı Tip Dönüşümleri:
Kod:
// Kullanıcı tarafından verilen veri
$userInput = $_POST['user_input'];
// Hazır ifade kullanımı
$stmt = $connection->prepare("SELECT * FROM data WHERE value = ?");
$stmt->bindValue(1, $userInput, PDO::PARAM_INT); // Parametrenin türünü belirtiyoruz
$stmt->execute();
// Sonuçları alma
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
Bu örnekler, farklı senaryolarda hazır ifadelerin nasıl kullanıldığını göstermektedir. Hazır ifadeler, veritabanı işlemlerini güvenli ve etkili bir şekilde gerçekleştirmenin önemli bir parçasıdır ve SQL enjeksiyonu gibi güvenlik sorunlarını önlemek için kritik bir rol oynar.
Örnek bir SQL enjeksiyon saldırısı:
Kod:
Girilen Kullanıcı Adı: ' OR '1'='1
Eğer bu giriş, doğrudan SQL sorgusuna yerleştirilirse:
Kod:
SELECT * FROM users WHERE username = '' OR '1'='1';
Bu, herhangi bir kullanıcı adı olmadan tüm kullanıcıları getirecek ve güvenlik açığını ortaya çıkaracaktır. Ancak hazır ifadeler kullanılıyorsa:
Kod:
$stmt = $connection->prepare("SELECT * FROM users WHERE username = ?");
$username = "' OR '1'='1";
$stmt->execute([$username]);
Parametreler güvenli bir şekilde yerleştirildiği için, sorgunun sonucu değiştirilmez ve güvenlik açığı engellenir.
Sonuç olarak, Prepared Statements (Hazır İfadeler) kullanarak SQL enjeksiyonu ve benzeri güvenlik sorunlarını büyük ölçüde engelleyebilirsiniz. Bu, modern uygulamaların ve veritabanlarının güvenliğini artıran önemli bir güvenlik uygulamasıdır.
Konumu Okuduğunuz İçin Teşekkür Ederim