SQL Enjeksiyonu, günümüzde hala önemli bir güvenlik tehdididir. Bir saldırgan, basit bir SQL sorgusunu manipüle ederek veritabanına erişebilir ve hassas bilgileri çalabilir. Bu saldırı, genellikle küçük bir kod hatasından kaynaklanır.
SQL Enjeksiyonu Nedir?
SQL Enjeksiyonu, güvenilmeyen kullanıcı girdisinin doğrudan bir SQL sorgusuna dahil edilmesidir. Bu, saldırganların sorguları manipüle etmelerine ve veritabanının davranışını kontrol etmelerine olanak tanır.
SQL Enjeksiyonu Nasıl Çalışır?
Tipik bir login sorgusu düşünün: SELECT * FROM users WHERE username = 'input' AND password = 'input'; Uygulama, girdinin normal kullanıcı verisi olmasını bekler.
Ancak bir saldırgan místo OR 1=1 -- gibi bir girdi sağlarsa ne olur?
OR 1=1her zaman doğrudur
--sorgunun geri kalanını yorumlar
Veritabanı, kimlik doğrulama kontrollerini atan bir değiştirilmiş sorguyu çalıştırmaya başlar.
Basit Bir Login Atlatma Örneği (Java)
Bu vulnerability nasıl ortaya çıkıyor?
❌ Güvensiz Uygulama
String username = request.getParameter("username"); String password = request.getParameter("password"); String query = "SELECT * FROM users WHERE username = '" + username + "' AND password = '" + password + "'"; Statement stmt = connection.createStatement(); ResultSet rs = stmt.executeQuery(query);
⚠️ Problem Nedir?
- Kullanıcı girdisi doğrudan SQL sorgusuna eklenir
- Kod ve veri arasında ayrıma yoktur
- Veritabanı, amaçlanan sorgu mantığı ve saldırgan girdisi arasında ayrım yapamaz
💥 Saldırgan Girdisi
kullanıcı adı: admin şifre: ' OR 1=1 --
💣 Sonuçlanan Sorgu
SELECT * FROM users WHERE username = 'admin' AND password = '' OR 1=1 --'
Kimlik doğrulama atlatılır.
Gerçek Dünyada Etkisi
SQL Enjeksiyonu sadece teorik değildir - ciddi sonuçlara neden olabilir:
- Yetkisiz login (kimlik doğrulama atlatma)
- Hassas verilerin ortaya çıkması
- Veritabanı kayıtlarının değiştirilmesi veya silinmesi
- Tam veritabanı tehlikesi
SQL Enjeksiyonunu Nasıl Önleyebiliriz?
SQL Enjeksiyonunu önlemek basittir - ancak doğru yapılması gerekir.
✅ 1. Hazırlanmış Sorguları Kullanın (Java)
String query = "SELECT * FROM users WHERE username = ? AND password = ?"; PreparedStatement pstmt = connection.prepareStatement(query); pstmt.setString(1, username); pstmt.setString(2, password); ResultSet rs = pstmt.executeQuery();
✅ 2. ORM Çerçevelerini Kullanın (JPA / Hibernate)
User user = userRepository.findByUsernameAndPassword(username, password);
ORM'ler, parametrelendirilmiş sorguları dahili olarak oluşturur, bu da SQL enjeksiyon riskini azaltmaya yardımcı olur.
✅ 3. Girdi Doğrulaması (Savunma Derinliği)
Girdi uzunluğunu sınırlayın İzin verilen karakterleri kısıtlayın
⚠️ Önemli: Girdi doğrulaması alone SQL Enjeksiyonunu önlemek için yeterli değildir. Çoğu SQL enjeksiyon açığı, geliştiricilerin bu konuda bilgi sahibi olmadıkları için değil, zaman baskısı altında alınan küçük kısaltmalar nedeniyle ortaya çıkar.
✅ 4. En Az Yetki Prensibi
Veritabanı kullanıcıları sadece gerekli izinlere sahip olmalıdır Uygulama erişiminde yönetici / kök kimlik bilgilerinin kullanılması kaçınılmalıdır
Ortak Hatalar
- Yalnızca girdi doğrulamasına güvenmek
- Parametrelendirilmiş sorgular yerine dizeleri elle kaçıştırmak
- Ön taraflı doğrulamaya güvenmek
- Hassas verileri içeren ham sorguları günlüğe kaydetmek
Son Düşünceler
SQL Enjeksiyonu karmaşık bir saldırı değildir - genellikle basit bir kod hatasından kaynaklanır.
Ancak etkisi ciddi olabilir.
Geliştirici olarak alınacak ders açıktır: Kullanıcı girdisine asla güvenmeyin, verileri her zaman koddan ayırın.
Küçük kararlar, uygulamanızın güvenli olup olmadığını belirleyebilir.
Yapay zeka özeti
SQL Enjeksiyonu, veritabanına erişimi tehlikeye atan bir güvenlik tehdididir. Öğrenin nasıl ortaya çıkar ve önlenir.