Prepared Statements Nedir ?

a3b2jeo.png

logo.png


Prepared Statements Nedir ?
Prepared Statements (Hazır İfadeler), veritabanı sorgularının veritabanı sunucusuna gönderilmeden önce önceden derlendiği ve parametrelerin yerleştirilmesiyle çalıştırıldığı bir veritabanı güvenlik ve performans tekniğidir. Bu yöntem, SQL enjeksiyonu gibi saldırı türlerine karşı koruma sağlarken aynı zamanda veritabanı işlemlerini daha etkili bir şekilde gerçekleştirmenize olanak tanır.

Prepared statements'ın temel bileşenleri şunlardır:

  1. 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.
  2. 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.
  3. 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.
Hazır ifadelerin avantajları şunlardı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.
Bir PHP örneğiyle hazır ifadelerin nasıl kullanıldığına bakalım:

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

a3b2jeo.png

 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.