1. SQL Injection - Veritabanı Güvenliği Tehdidi
SQL Injection, web uygulamalarında en yaygın güvenlik açıklarından biridir. Eğer geliştirici, kullanıcılardan gelen verileri düzgün bir şekilde doğrulamaz ve doğrudan SQL sorgularına dahil ederse, kötü niyetli bir kullanıcı, bu verileri manipüle ederek veritabanınıza zarar verebilir. Bu tür bir saldırıyı önlemek için, hazır SQL komutları (prepared statements) kullanmalı ve girdi doğrulama işlemlerini mutlaka gerçekleştirmelisiniz.
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username");
$stmt->bindParam(':username', $username);
$stmt->execute();
2. Cross-Site Scripting (XSS) - Kötü Amaçlı Scriptler
XSS, kötü niyetli kullanıcıların, sizin web sitenize zararlı JavaScript kodları yerleştirmesidir. Bu sayede kullanıcıların tarayıcılarında kötü amaçlı işlemler yapılabilir. PHP ile geliştirilen sayfalarda kullanıcılardan gelen verileri sanitize etmemek, XSS saldırısına açık hale gelmenize sebep olur. Verileri her zaman HTML formatında güvenli hale getirmelisiniz.
echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
3. CSRF (Cross-Site Request Forgery) - Kullanıcıyı Kandırma Yöntemi
Bir kullanıcının kimliğini çalmak ve onun adına yetkisiz işlemler gerçekleştirmek için kullanılan bu tür saldırılar, özellikle oturum yönetimi zayıf olan uygulamalarda etkili olabilir. CSRF token kullanarak her formda doğrulama yaparak, bu tür saldırılara karşı uygulamanızı koruyabilirsiniz.
if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
die("Invalid CSRF Token");
}
4. Parola Güvenliği - Zayıf Şifreler
Birçok geliştirici, kullanıcıların şifrelerini güvensiz bir şekilde depolar. Özellikle, şifrelerin düz metin olarak kaydedilmesi büyük bir tehlikedir. PHP'de şifreleri güvenli bir şekilde saklamak için password_hash() ve password_verify() fonksiyonlarını kullanmalısınız. Ayrıca, kullanıcıların güçlü şifreler seçmelerini sağlamak için bir şifre politikası oluşturmalısınız.
$passwordHash = password_hash($password, PASSWORD_DEFAULT);
if (password_verify($input_password, $passwordHash)) {
echo "Login successful!";
}
5. Dosya Yükleme Güvenliği - Zararlı Dosyaların Yüklenmesi
PHP, kullanıcıların dosya yüklemesine olanak tanır, ancak bu, eğer düzgün bir şekilde güvenlik önlemleri alınmazsa kötüye kullanılabilir. Kullanıcıların yüklediği dosyaların türünü doğrulamadan doğrudan sunucunuza kaydetmek, kötü niyetli bir dosyanın sisteme zarar vermesine yol açabilir. Dosya yüklemelerinde mutlaka dosya tipi kontrolü, boyut sınırlaması ve yol güvenliği gibi önlemler almalısınız.
$allowed_types = ['image/jpeg', 'image/png'];
if (!in_array($_FILES['file']['type'], $allowed_types)) {
die("Invalid file type");
}
6. Hatalı Hata Mesajları - Kötü Amaçlı Bilgi Sızıntısı
Geliştirme aşamasında hatalar, genellikle detaylı mesajlarla kullanıcıya bildirilir. Ancak, bu hatalar, kötü niyetli kişilerin uygulamanızın zayıf yönlerini keşfetmesine yardımcı olabilir. Hata mesajlarını üretirken, kullanıcıya yalnızca gerekli bilgileri sunmalı ve ayrıntılı hata mesajlarını sistemde kaydetmelisiniz.
7. Oturum Yönetimi - Güvenli Oturum Kapanışı
PHP ile yapılan web uygulamalarında, oturum yönetimi doğru yapılmazsa, oturumlar kötüye kullanılabilir. Oturum çalınabilir veya geçici oturum kimlikleri zayıf kalabilir. Oturum sonlandırma ve oturum güvenliği için her zaman SSL kullanmalı ve oturum süresi sınırlamalarını uygulamalısınız.
session_regenerate_id(true);
session_destroy();
Sonuç
PHP güvenliği, çoğu zaman göz ardı edilen ama son derece önemli bir konudur. Yukarıda bahsedilen güvenlik açıkları, basit önlemlerle önlenebilir ve web uygulamanızın güvenliğini büyük ölçüde artırabilir. Unutmayın, güvenlik bir kere sağlandıktan sonra, geliştiricilerin geri dönüp düzenli olarak güncellemeler yapması ve en son güvenlik tehditlerini takip etmesi gerekir. Bu yazıda ele aldığımız 7 kritik PHP güvenlik açığını önlemek, yalnızca web sitenizi değil, kullanıcılarınızı da korur.