PHP Web Uygulamalarında Siber Savunma: Güvenli Kod Geliştirme Rehberi
Dijital ekosistemin en köklü ve en yaygın dillerinden biri olan PHP, bugün internetteki web sitelerinin çok büyük bir kısmına güç vermektedir. Ancak bu popülerlik, PHP tabanlı uygulamaları siber saldırganların da bir numaralı hedefi haline getirmektedir. Web sitenizin güvenliği, projenizin canlıya çıkmasından sonra eklenen bir katman değil; mimarinin ilk satır kodundan itibaren inşa edilmesi gereken bir kültürdür.
Bir PHP web sitesini dışarıdan gelebilecek kötü niyetli saldırılara, veri sızıntılarına ve manipülasyonlara karşı korumak için projenizde mutlaka uygulamanız gereken en kritik güvenlik önlemlerini kapsamlı bir şekilde inceleyelim.
1. Veritabanı Güvenliği ve SQL Injection Koruması
Web uygulamalarına yönelik en ölümcül saldırıların başında SQL Injection (SQLi) gelir. Saldırganlar, form alanları veya URL parametreleri aracılığıyla veritabanı sorgularını manipüle ederek yetkisiz verilere erişebilir, verileri silebilir veya değiştirebilir.
Prepared Statements (Hazırlanmış İfadeler) Kullanımı
PHP'de SQL Injection'ı engellemenin kesin yolu, eski mysql_* fonksiyonlarını (zaten kaldırıldı) tamamen unutmak ve PDO veya MySQLi ile Prepared Statements kullanmaktır.
Hatalı ve Güvensiz Yöntem:
PHP// Saldırgan $id yerine "1 OR 1=1" yazarsa tüm veritabanı açığa çıkar! $id = $_GET['id']; $query = "SELECT * FROM users WHERE id = " . $id; $result = $db->query($query);Güvenli Yöntem (PDO):
PHP$id = (int)$_GET['id']; // Tür dönüşümü ile ekstra koruma $stmt = $pdo->prepare('SELECT * FROM users WHERE id = :id'); $stmt->execute(['id' => $id]); $user = $stmt->fetch();
Prepared statements sayesinde gönderilen veri sorgunun bir parçası olarak değil, sadece bir parametre olarak işlenir ve saldırı kodu çalıştırılamaz.
2. Kullanıcı Girdilerinin Temizlenmesi ve Çıktı Güvenliği (XSS Savunması)
Cross-Site Scripting (XSS), saldırganların web sitenize kötü niyetli JavaScript kodları enjekte etmesiyle gerçekleşir. Bu kodlar sitenizi ziyaret eden diğer kullanıcıların tarayıcısında çalışarak oturum (Session) hırsızlığına veya site içeriğinin değiştirilmesine yol açar.
Girdileri Filtreleyin, Çıktıları Maskeleyin (Sanitization & Escaping)
Girdi Kontrolü (Filter): Kullanıcıdan e-posta bekliyorsanız
filter_var()fonksiyonu ile bunu doğrulayın.PHP$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);Çıktı Güvenliği (Escape): Kullanıcıdan alınan bir veriyi ekrana yazdırırken mutlaka HTML özel karakterlerini maskeleyin. Bu amaçla
htmlspecialchars()fonksiyonunu kullanın:PHP// Kullanıcı adı olarak <script>alert('hack')</script> girilse bile zararsız metne dönüşür. echo htmlspecialchars($username, ENT_QUOTES, 'UTF-8');
3. Oturum (Session) ve Çerez (Cookie) Güvenliği
Kullanıcıların sitenizde oturum açtığı mekanizma olan Session yapısı, doğru yapılandırılmadığında "Oturum Çalma" (Session Hijacking) saldırılarına davetiye çıkarır.
Güvenli Session Ayarları
PHP scriptlerinizin en başında, çerezlerin tarayıcı tarafından güvenli şekilde saklanmasını sağlayacak parametreleri tanımlayın:
ini_set('session.cookie_httponly', 1); // JavaScript'in çerezlere erişimini engeller (XSS'e karşı koruma).
ini_set('session.cookie_secure', 1); // Çerezlerin sadece HTTPS (şifreli) bağlantılarda iletilmesini sağlar.
ini_set('session.use_only_cookies', 1); // Session ID'nin URL üzerinden taşınmasını engeller.
ini_set('session.cookie_samesite', 'Strict'); // CSRF saldırılarına karşı çerezi korur.
session_start();
Ek olarak, kullanıcı giriş yaptığında veya yetki seviyesi değiştiğinde session_regenerate_id(true); fonksiyonunu çağırarak mevcut Session ID'yi yenileyin.
4. CSRF (Cross-Site Request Forgery) Saldırılarını Engelleme
CSRF, bir kullanıcının güvenilir bir sitede açık olan oturumunu kullanarak, onun haberi olmadan üçüncü taraf bir site üzerinden istek (örn: şifre değiştirme, para transferi) gönderilmesi saldırısıdır.
CSRF Token Mekanizması
Form işlemlerinde mutlaka her oturuma özgü, tahmin edilmesi imkansız bir CSRF Token (rastgele string) üretin. Form gönderildiğinde bu token'ı arka planda kontrol edin.
// Token Oluşturma (Formun içine gizli input olarak koyulur)
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
// Form Kontrolü (POST isteği geldiğinde)
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (!hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
die("Geçersiz CSRF isteği!");
}
}
5. Güvenli Şifreleme (Password Hashing)
Kullanıcı şifrelerinin veritabanında düz metin (plain text) olarak veya modası geçmiş md5(), sha1() gibi algoritmalarla saklanması kabul edilemez bir güvenlik zaafiyetidir. Veritabanı sızdırıldığında tüm kullanıcı şifreleri deşifre olur.
BCRYPT ve Argon2 Algoritmaları
PHP'nin modern password_hash() fonksiyonu, şifreleri endüstri standardı olan güçlü algoritmalarla ve her şifreye özel rastgele tuzlama (salt) ekleyerek şifreler.
// Şifreyi Kaydetme
$hashedPassword = password_hash($password, PASSWORD_BCRYPT);
// Giriş Yaparken Şifre Doğrulama
if (password_verify($password, $user['password_hash'])) {
// Şifre doğru, oturumu başlat
}
6. Dosya Yükleme (File Upload) Kontrolleri
Kullanıcıların profil resmi veya doküman yüklemesine izin verilen alanlar, sisteme kötü niyetli bir .php dosyası (Web Shell) yüklenip sunucunun tamamen ele geçirilmesiyle sonuçlanabilir.
Dosya Yükleme Güvenlik Kuralları
Uzantı Kontrolü Yapmayın, MIME Türüne Bakın: Dosya uzantısının sadece
.jpgolup olmadığına bakmak yetmez.mime_content_type()fonksiyonu ile dosyanın gerçek içeriğini kontrol edin.Yüklenen Dosyayı Yeniden Adlandırın: Kullanıcının gönderdiği dosya adını doğrudan kaydetmeyin.
md5(uniqid())gibi rastgele isimler verin ve uzantıyı kendiniz ekleyin.Çalıştırma Yetkisini Kaldırın: Yüklenen dosyaların tutulduğu klasörde
.htaccesskullanarak PHP kodlarının çalıştırılmasını engelleyin:ApacheRemoveHandler .php .phtml .php3 php_flag engine off
7. Sunucu Yapılandırması ve Dosya Sistemi Güvenliği
php.ini Ayarlarını Sıkılaştırın
Üretim ortamındaki (canlıdaki) sunucunuzda şu ayarları mutlaka kapatın veya sınırlandırın:
display_errors = Off-> Hataları ekrana basarak saldırganlara sistem mimarisi hakkında ipucu vermeyin. Hataları gizli bir log dosyasına kaydedin.expose_php = Off-> HTTP başlıklarında PHP sürümünüzün yayınlanmasını engeller.allow_url_fopen = Offveallow_url_include = Off-> Uzaktan kod yürütme (RFI) saldırılarını engeller.
Açık Klasör Yapısını Engelleyin
Uygulamanızın çekirdek kodları, ayar dosyaları (veritabanı şifreleri) ve kütüphaneleri, web üzerinden doğrudan erişilemeyen bir üst dizinde yer almalıdır. Sadece index.php, CSS ve JS gibi genel dosyalar public veya www klasörünün içinde bulunmalıdır.
Sonuç
Web güvenliği statik bir hedef değil, sürekli güncellenmesi gereken dinamik bir süreçtir. Geliştirdiğiniz PHP uygulamalarında "Asla kullanıcı girdisine güvenme" prensibini ilke edinerek, modern şifreleme ve filtreleme metotlarını eksiksiz uygulamalısınız. Ayrıca sitenizin tamamında HTTPS (SSL/TLS) sertifikası kullanmak, veri trafiğinin şifrelenmesi için artık bir lüks değil zorunluluktur. Güvenli kod yazmak projenizin kalitesini ve topluluğunuzun size olan güvenini en üst seviyede tutacaktır.
Yorumlar
Yorum Gönder