SQL Injection, web sitelerinin en yaygın ve tehlikeli güvenlik açıklarından biridir. Bu saldırı yöntemi, kötü niyetli kişilerin veritabanına yetkisiz erişim sağlamasına neden olabilir. Verileri değiştirmek, kullanıcı bilgilerini çalmak veya sunucu üzerinde zararlı işlemler yapmak için kullanılır.
Bu yazıda, SQL Injection saldırılarının nasıl çalıştığını ve bunlardan nasıl korunabileceğinizi detaylı bir şekilde anlatmaya çalışacağım.
1. SQL Injection Nasıl Çalışır?
SQL Injection saldırıları, genellikle kullanıcı giriş formlarında, arama kutularında veya URL parametrelerinde bulunan güvenlik açıklarından faydalanarak gerçekleştirilir.
Örneğin, aşağıdaki hatalı SQL sorgusu, saldırıya açıktır:
$user = $_GET['user'];
$query = "SELECT * FROM users WHERE username = '$user'";
$result = mysqli_query($conn, $query);
Eğer saldırgan şu girdiyi girerse:
' OR '1'='1
Oluşan SQL sorgusu şu hale gelir:
SELECT * FROM users WHERE username = '' OR '1'='1'
Bu sorgu her zaman doğru olduğu için, saldırgan tüm kullanıcı bilgilerine erişebilir! 🔥
2. SQL Injection ile Yapılabilecek Saldırılar
Bir SQL Injection saldırısıyla yapılabilecek bazı tehlikeli işlemler şunlardır:
✅ Kullanıcı bilgilerini çalma: Tüm kullanıcı adlarını ve şifreleri ele geçirme.
✅ Yetkisiz giriş: Yönetici hesabına erişim sağlama.
✅ Veritabanı değiştirme: Mevcut verileri değiştirme veya silme.
✅ Sunucu kontrolü: Hatta bazı durumlarda sunucuya komutlar çalıştırma!
3. SQL Injection’dan Korunma Yöntemleri
SQL Injection saldırılarını önlemenin en etkili yolu hazırlıklı (prepared) ifadeler ve parametreli sorgular kullanmaktır.
1️⃣ Hazırlıklı (Prepared) İfadeler Kullanın
Hazırlıklı ifadeler, SQL sorgularını kullanıcı girdisinden bağımsız hale getirerek güvenliği artırır.
PHP PDO Kullanarak Güvenli Sorgu:
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$user]);
$result = $stmt->fetch();
MySQLi ile Güvenli Sorgu:
$stmt = $conn->prepare("SELECT * FROM users WHERE username = ?");
$stmt->bind_param("s", $user);
$stmt->execute();
✅ Avantajları:
- SQL Injection saldırılarını önler.
- Verileri doğru biçimde işler.
- Daha performanslıdır.
2️⃣ Kullanıcı Girdilerini Filtreleyin
Kullanıcılardan alınan verileri doğrulayarak ve filtreleyerek zararlı girdileri önleyebilirsiniz.
🔒 Güvenli bir giriş verisi doğrulama örneği:
$username = filter_input(INPUT_GET, 'user', FILTER_SANITIZE_STRING);
❌ Hatalı Kullanım:
$query = "SELECT * FROM users WHERE username = '" . $_GET['user'] . "'";
🚫 Bu yöntem güvenli değildir!
3️⃣ Web Güvenlik Duvarı (WAF) Kullanın
Web uygulamaları için güvenlik duvarları (WAF), kötü niyetli SQL sorgularını otomatik olarak engelleyebilir. Önerilen WAF çözümleri:
- 🔹 Cloudflare WAF
- 🔹 ModSecurity
- 🔹 Sucuri Firewall
4️⃣ Veritabanı Yetkilerini Sınırlandırın
SQL Injection saldırılarının etkisini azaltmak için veritabanı kullanıcılarına minimum yetki verin.
🔒 Önerilen izinler:
- ✅ Okuma (SELECT) yetkisini sınırlandırın.
- ✅ Veritabanı yöneticisi (root) hesabını kullanmayın.
- ✅ Yalnızca gerekli işlemleri gerçekleştirmek için ayrı kullanıcılar oluşturun.
Örneğin, salt okunur bir kullanıcı oluşturmak için:
GRANT SELECT ON database_name.* TO 'readonly_user'@'localhost' IDENTIFIED BY 'güçlüşifre';
SQL Injection saldırıları, doğru önlemler alındığında kolayca önlenebilir. Veritabanınızı güvence altına almak için:
✅ Prepared statements kullanın.
✅ Kullanıcı girdilerini mutlaka filtreleyin.
✅ Güvenlik duvarları ve izin sistemlerini aktif hale getirin.
Güvenli bir web uygulaması geliştirmek için bu önlemleri alarak verilerinizi koruyabilirsiniz!