- Katılım
- 10 Nisan 2025
- Mesajlar
- 803
- Reaksiyon puanı
- 84
Web uygulamaları geliştirilirken en çok karşılaşılan güvenlik açıklarından biri SQL Injection (SQL Enjeksiyonu)'dur. Bu açıklar, uygulama ile veri tabanı arasındaki iletişimi manipüle ederek yetkisiz veri erişimi, veri silme, güncelleme ya da tüm veri tabanının ele geçirilmesine neden olabilir.
Bu makalede, SQL açıklarının nedenlerini, örneklerini ve etkili önleme yöntemlerini detaylı bir şekilde ele alacağız.
SQL güvenlik açıkları, kullanıcıdan alınan verilerin doğrudan SQL sorgularına eklenmesiyle ortaya çıkar. Saldırganlar, uygulama mantığını manipüle ederek veri tabanına doğrudan komut verebilir.
sql
KopyalaDüzenle
SELECT * FROM users WHERE username = '$username' AND password = '$password';
Eğer kullanıcı adını şu şekilde girerse:
sql
KopyalaDüzenle
' OR 1=1 --
Sorgu şu hale gelir:
sql
KopyalaDüzenle
SELECT * FROM users WHERE username = '' OR 1=1 --' AND password = '';
Bu, tüm kullanıcıları listeleyebilir veya sisteme yetkisiz giriş sağlar.
Hazır sorgular (prepared statements) kullanıcıdan gelen veriyi ayrı tutarak, verinin SQL komutu gibi çalışmasını engeller.
php
KopyalaDüzenle
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username");
$stmt->execute(['username' => $user_input]);
python
KopyalaDüzenle
cursor.execute("SELECT * FROM users WHERE username = %s", (username,))
ORM'ler (örneğin: SQLAlchemy, Django ORM, Hibernate), SQL sorgularını arka planda otomatik üretir ve kullanıcıdan gelen verileri güvenli şekilde işler.
Kullanıcıdan gelen tüm veriler mutlaka filtrelenmeli ve doğrulanmalıdır. Örneğin:
PHP Örneği:
php
KopyalaDüzenle
$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
Uygulamanın kullandığı veri tabanı kullanıcı hesabına sadece gerekli olan yetkiler verilmelidir:
Veri tabanı veya sistem hataları, saldırgana yol gösterici olabilir. Bunun için:
php
KopyalaDüzenle
try {
// kod
} catch (Exception $e) {
echo "Beklenmeyen bir hata oluştu.";
error_log($e->getMessage());
}
Web uygulama güvenlik duvarları, SQL injection gibi saldırıları uygulamaya ulaşmadan engelleyebilir.
Popüler çözümler:
Veri tabanına gelen isteklerin loglanması, anormal sorguları tespit etmenizi sağlar. Özellikle login, arama ve filtreleme gibi alanlar izlenmelidir.
Uygulama yayına alınmadan önce aşağıdaki adımlar uygulanmalıdır:
Bu makalede, SQL açıklarının nedenlerini, örneklerini ve etkili önleme yöntemlerini detaylı bir şekilde ele alacağız.
SQL Güvenlik Açıkları Nedir?
SQL güvenlik açıkları, kullanıcıdan alınan verilerin doğrudan SQL sorgularına eklenmesiyle ortaya çıkar. Saldırganlar, uygulama mantığını manipüle ederek veri tabanına doğrudan komut verebilir.
Örnek SQL Injection Açığı:
sql
KopyalaDüzenle
SELECT * FROM users WHERE username = '$username' AND password = '$password';
Eğer kullanıcı adını şu şekilde girerse:
sql
KopyalaDüzenle
' OR 1=1 --
Sorgu şu hale gelir:
sql
KopyalaDüzenle
SELECT * FROM users WHERE username = '' OR 1=1 --' AND password = '';
Bu, tüm kullanıcıları listeleyebilir veya sisteme yetkisiz giriş sağlar.
SQL Açıklarını Önleme Yolları
1. Hazır (Parametreli) Sorgular Kullanın
Hazır sorgular (prepared statements) kullanıcıdan gelen veriyi ayrı tutarak, verinin SQL komutu gibi çalışmasını engeller.
PHP – PDO Örneği:
php
KopyalaDüzenle
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username");
$stmt->execute(['username' => $user_input]);
Python – psycopg2 Örneği:
python
KopyalaDüzenle
cursor.execute("SELECT * FROM users WHERE username = %s", (username,))
2. ORM (Object-Relational Mapping) Araçları Kullanın
ORM'ler (örneğin: SQLAlchemy, Django ORM, Hibernate), SQL sorgularını arka planda otomatik üretir ve kullanıcıdan gelen verileri güvenli şekilde işler.
3. Girdi Doğrulama ve Temizleme
Kullanıcıdan gelen tüm veriler mutlaka filtrelenmeli ve doğrulanmalıdır. Örneğin:
- Sayısal veri beklenen yerde yalnızca rakamlar kabul edilmelidir.
- E-posta, kullanıcı adı gibi alanlar regex ile doğrulanmalıdır.
PHP Örneği:
php
KopyalaDüzenle
$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
4. Minimum Yetki Prensibi (Least Privilege)
Uygulamanın kullandığı veri tabanı kullanıcı hesabına sadece gerekli olan yetkiler verilmelidir:
- SELECT, INSERT gerekiyorsa sadece onlar tanımlanmalı.
- DROP, DELETE gibi kritik izinler verilmemelidir.
5. Hata Mesajlarını Gizleyin
Veri tabanı veya sistem hataları, saldırgana yol gösterici olabilir. Bunun için:
- Üretim ortamında ayrıntılı hata mesajları gösterilmemeli.
- Hatalar loglanmalı ama kullanıcıya özel mesaj gösterilmelidir.
php
KopyalaDüzenle
try {
// kod
} catch (Exception $e) {
echo "Beklenmeyen bir hata oluştu.";
error_log($e->getMessage());
}
6. WAF (Web Application Firewall) Kullanımı
Web uygulama güvenlik duvarları, SQL injection gibi saldırıları uygulamaya ulaşmadan engelleyebilir.
Popüler çözümler:
- Cloudflare WAF
- ModSecurity
- AWS WAF
7. SQL Erişim Loglarını İnceleyin
Veri tabanına gelen isteklerin loglanması, anormal sorguları tespit etmenizi sağlar. Özellikle login, arama ve filtreleme gibi alanlar izlenmelidir.
8. Güvenlik Testleri ve Kod Denetimi
Uygulama yayına alınmadan önce aşağıdaki adımlar uygulanmalıdır:
- Penetrasyon testleri (pentest)
- Statik kod analiz araçları (SonarQube, Fortify)
- OWASP ZAP / Burp Suite ile tarama
Ekstra Güvenlik Önerileri
- SSL/TLS ile veri şifreleme
- Oturum yönetimi ve token doğrulama sistemlerinin güvenliği
- SQL veritabanının son güncellemelerinin yapılması
- Veri tabanı şemalarının dışarıdan erişime kapatılması