
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.
Eğer saldırgan şu girdiyi girerse:
Oluşan SQL sorgusu şu hale gelir:
Bu sorgu her zaman doğru olduğu için, saldırgan tüm kullanıcı bilgilerine erişebilir! 🔥
MySQLi ile Güvenli Sorgu:
🚫 Bu yöntem güvenli değildir!
SQL Injection saldırıları, doğru önlemler alındığında kolayca önlenebilir. Veritabanınızı güvence altına almak için:
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:
PHP
$user = $_GET['user'];
$query = 'SELECT * FROM users WHERE username = '$user'';
$result = mysqli_query($conn, $query);
GENEL
' OR '1'='1
SQL
SELECT * FROM users WHERE username = '' OR '1'='1'
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:
PHP
$stmt = $pdo->prepare('SELECT * FROM users WHERE username = ?');
$stmt->execute([$user]);
$result = $stmt->fetch();
PHP
$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:
PHP
$username = filter_input(INPUT_GET, 'user', FILTER_SANITIZE_STRING);
- ❌ Hatalı Kullanım:
PHP
$query = 'SELECT * FROM users WHERE username = '' . $_GET['user'] . ''';
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.
SQL
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.
Benzer Yazılar

Linux Güvenliği
0 Yorumlar

Web Uygulaması Güvenliği - (OWASP Top 10)
0 Yorumlar

Sosyal Mühendislik Saldırıları
0 Yorumlar
Yorumlar ()
Henüz yorum yok. İlk yorum yapan sen ol!