Reklam Alanı. Site Teknik Bakım Aşamasındadır.Bu Sırada Forum Açıktır

SQL Güvenlik Açıkları ve Önleme Yolları

Archive Admin

Yönetici
Yönetim Kurulu Başkanı
Katılım
10 Nisan 2025
Mesajlar
799
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ı 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ı
 
Üst