SQL Enjeksiyonu ve Parametreli Sorgular
Her zaman PDO ile hazırlanmış ifadeler kullanarak enjeksiyon risklerini ortadan kaldırın.
SQL Enjeksiyonu ve Parametreli Sorgular, CoddyKit'te ücretsiz bir PHP Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, PHP Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. PHP Academy kursu toplamda 4 dersten oluşur.
SQL Enjeksiyonu Nedir?
SQL enjeksiyonu, kullanıcı tarafından sağlanan verilerin doğrudan bir SQL sorgusuna yerleştirilmesiyle gerçekleşir ve saldırganların sorguyu değiştirerek verilere erişmesine, verileri değiştirmesine veya silmesine olanak tanır.
Klasik Örnek
Kullanıcı girdisini SQL'e birleştirme:
<?php
// VULNERABLE: attacker enters username = "' OR '1'='1"
$sql = "SELECT * FROM users WHERE username = '".$_GET["username"]."'";
// Becomes: SELECT * FROM users WHERE username = '' OR '1'='1'
// Returns ALL users!Veri Sızdırma Örneği
Bir saldırgan, diğer tablolardaki verileri sızdırmak için UNION SELECT kullanır.
// Input: ' UNION SELECT username, password FROM admin_users--
// This appends a second SELECT returning admin credentialsHazırlanmış Sorgular Çözümdür
Hazırlanmış sorgularda, herhangi bir veri sağlanmadan önce sorgu yapısı sabitlenir. Veritabanı, bağlanan tüm değerleri gerçek veri olarak ele alır; hiçbir zaman SQL kodu olarak değerlendirmez.
<?php
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$_GET["username"]]);
// Safe even if username = "' OR 1=1--"Adlandırılmış Yer Tutucular
Adlandırılmış yer tutucular, özellikle birden çok parametreyle çalışırken daha anlaşılırdır.
<?php
$stmt = $pdo->prepare(
"SELECT * FROM users WHERE email = :email AND active = :active"
);
$stmt->execute([":email" => $email, ":active" => true]);Eloquent Varsayılan Olarak Güvenlidir
Laravel Eloquent, tüm standart sorgu oluşturucu işlemleri için arka planda PDO hazırlanmış sorgularını kullanır.
<?php
// Safe:
User::where("email", $email)->first();
// UNSAFE: raw query with user input!
DB::select("SELECT * FROM users WHERE email = ".$email);Ham Sorgular
Laravel'de ham SQL kullanmanız gerektiğinde her zaman parametre bağlamalarını kullanın.
<?php
// Safe raw query:
$users = DB::select("SELECT * FROM users WHERE email = ?", [$email]);
// Or with named bindings:
$users = DB::select("SELECT * FROM users WHERE email = :email", [":email" => $email]);LIKE Yan Tümcesi Enjeksiyonu
LIKE yan tümceleri özel işlem gerektirir; joker karakterler (%, _) bağlamadan önce elle kaçışlanmalıdır.
<?php
$search = str_replace(["%", "_", "\\"], ["\%", "\_", "\\\\"], $userInput);
$stmt = $pdo->prepare("SELECT * FROM products WHERE name LIKE ?");
$stmt->execute(["%$search%"]);ORDER BY Enjeksiyonu
Sütun adları ve ORDER BY yönleri parametreleştirilemez. Bunları bir beyaz listeye göre doğrulayın.
<?php
$allowedColumns = ["name", "price", "created_at"];
$col = in_array($request->sort, $allowedColumns) ? $request->sort : "name";
$dir = $request->dir === "desc" ? "desc" : "asc";
// Then safely build the query stringSaklı Yordamlar
Saklı yordamlar da girdiyi kendi içinde birleştiriyorsa güvenlik açığı barındırabilir. Her zaman parametreli çağrılar kullanın.
En Az Yetki İlkesi
PHP'den bağlanan veritabanı kullanıcısı, yalnızca gerekli tablolarda SELECT/INSERT/UPDATE/DELETE yetkilerine sahip olmalıdır; CREATE, DROP veya yönetici yetkilerine asla sahip olmamalıdır.
Özet
Bağlanmış parametrelerle hazırlanmış sorguları ALWAYS kullanın. Kullanıcı girdisini SQL'e asla birleştirmeyin. ORDER BY ifadelerini ve sütun adlarını bir beyaz listeye göre doğrulayın. Öykünülmüş hazırlama devre dışı bırakılmış şekilde PDO kullanın.
Hızlı Kontrol
SQL enjeksiyonuna karşı korunmanın doğru yolu nedir?
Sıkça Sorulan Sorular
“SQL Enjeksiyonu ve Parametreli Sorgular” dersi ücretsiz mi?
Evet — “SQL Enjeksiyonu ve Parametreli Sorgular” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve PHP Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. PHP Academy kursu toplamda 4 dersten oluşur.
“SQL Enjeksiyonu ve Parametreli Sorgular” dersinde ne öğreneceğim?
Her zaman PDO ile hazırlanmış ifadeler kullanarak enjeksiyon risklerini ortadan kaldırın. PHP Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
PHP Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te PHP Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“SQL Enjeksiyonu ve Parametreli Sorgular” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu PHP Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her PHP Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Siteler Arası Betik Çalıştırmayı (XSS) Önleme
- SQL Enjeksiyonu ve Parametreli Sorgular
- CSRF Koruması
- Güvenli Parola Saklama