Php İle Güvenli Veri Filtreleme İşlemi Nasıl Yapılır?

Php İle Güvenli Veri Filtreleme İşlemi Nasıl Yapılır?
Php İle Güvenli Veri Filtreleme İşlemi Nasıl Yapılır?

PHP ile Güvenli Veri Filtreleme İşlemi Nasıl Yapılır?

PHP ile güvenli veri filtreleme işlemi, modern web uygulamalarının temel taşıdır. Kullanıcıdan gelen her türlü veri potansiyel bir tehdit unsuru taşıyabilir; bu nedenle dış dünyadan gelen hiçbir veriye güvenmemek, yazılım geliştirme disiplininin en önemli kuralıdır. Bu rehberde, PHP kullanarak verileri nasıl temizleyeceğinizi, doğrulayacağınızı ve veritabanı işlemlerinde nasıl güvenli hale getireceğinizi adım adım öğreneceksiniz.

Bu makale, PHP projelerinde XSS (Cross-Site Scripting) ve SQL Injection gibi yaygın güvenlik açıklarını kapatmak isteyen geliştiriciler için hazırlanmıştır. 2026 yılı standartlarına uygun olarak, eski ve güvensiz yöntemler yerine modern filtreleme fonksiyonları ve PDO (PHP Data Objects) yapısı üzerinde duracağız.

Gereksinimler ve Ön Hazırlık

Güvenli veri işleme süreçlerine başlamadan önce geliştirme ortamınızın güncel olduğundan emin olmalısınız. PHP 8.2 ve üzeri sürümler, tip güvenliği (type hinting) ve performans iyileştirmeleri sayesinde daha güvenli kod yazmanıza olanak tanır.

  • PHP 8.2 veya daha yeni bir sürüm.
  • Veritabanı işlemleri için PDO eklentisinin aktif olması.
  • Kod editörünüzde hata ayıklama (debugging) modunun açık olması.
  • Temel düzeyde PHP sözdizimi bilgisi.

PHP Filter_Var Kullanımı ile Veri Doğrulama

PHP'nin yerleşik filter_var() fonksiyonu, verileri doğrulamak (validate) ve temizlemek (sanitize) için en güvenli yoldur. Doğrulama, verinin beklenen formatta olup olmadığını kontrol ederken, temizleme veriyi zararlı karakterlerden arındırır.

Aşağıdaki örnekte, kullanıcıdan gelen bir e-posta adresinin geçerli olup olmadığını nasıl kontrol edeceğinizi görebilirsiniz:


$email = "test@example.com";

if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
    echo "E-posta adresi geçerli.";
} else {
    echo "Geçersiz e-posta formatı!";
}

Bu kod bloğunda, FILTER_VALIDATE_EMAIL filtresi kullanılarak verinin standart e-posta formatına uygunluğu denetlenir. Eğer veri uygun değilse, uygulama hata döndürerek hatalı verinin işlenmesini engeller.

Veri Temizleme (Sanitization) Adımları

Veri temizleme, verinin içindeki tehlikeli karakterleri (örneğin HTML etiketleri) kaldırma işlemidir. Kullanıcı girdilerini bir veritabanına kaydetmeden veya ekrana yazdırmadan önce mutlaka temizlemelisiniz.


$kullaniciGirdisi = "alert('XSS');Merhaba";

// HTML etiketlerini temizle
$temizVeri = filter_var($kullaniciGirdisi, FILTER_SANITIZE_FULL_SPECIAL_CHARS);

echo $temizVeri; 
// Çıktı: <script>alert('XSS');</script>Merhaba

FILTER_SANITIZE_FULL_SPECIAL_CHARS filtresi, özel karakterleri HTML entity'lerine dönüştürerek tarayıcının bu karakterleri kod olarak değil, düz metin olarak algılamasını sağlar. Bu, XSS saldırılarına karşı ilk savunma hattınızdır.

SQL Injection Koruması: Hazırlanmış İfadeler (Prepared Statements)

Veritabanı sorgularında veri filtrelemenin en güvenli yolu, PDO ile hazırlanmış ifadeler kullanmaktır. Kullanıcıdan gelen veriyi asla doğrudan SQL sorgusunun içine yazmayın.


$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'kullanici', 'sifre');

$id = 15;
$stmt = $pdo->prepare("SELECT * FROM kullanicilar WHERE id = :id");
$stmt->bindParam(':id', $id, PDO::PARAM_INT);
$stmt->execute();

$kullanici = $stmt->fetch();

Burada :id yer tutucusu (placeholder) kullanılarak veritabanı motoruna verinin güvenli bir şekilde aktarılması sağlanır. Bu yöntem, SQL Injection saldırılarını kökünden engeller çünkü veri, sorgu yapısından tamamen ayrı tutulur.

Güvenli Veri Filtreleme Yöntemlerinin Karşılaştırılması

Aşağıdaki tablo, farklı veri türleri için kullanılan en yaygın yöntemleri ve özelliklerini özetlemektedir:

Yöntem Kullanım Amacı Avantajı Risk
filter_var Girdi Doğrulama Hızlı ve yerleşik Karmaşık mantıkta yetersiz kalabilir
PDO Prepared Veritabanı Güvenliği SQL Injection'ı tamamen engeller Yanlış kullanımda (string birleştirme) risklidir
htmlspecialchars XSS Koruması Basit ve etkili Sadece çıktı aşamasında işe yarar

Form Verilerini Güvenli İşleme Adım Adım

Bir formdan gelen veriyi işlerken izlemeniz gereken standart akış; temizle, doğrula ve güvenli kaydet şeklindedir.


if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $isim = trim($_POST['isim']);
    $yas = filter_var($_POST['yas'], FILTER_VALIDATE_INT);

    if ($yas === false) {
        die("Geçersiz yaş bilgisi.");
    }

    // Veritabanına kaydetme işlemi (PDO ile)
    $stmt = $pdo->prepare("INSERT INTO uyeler (isim, yas) VALUES (?, ?)");
    $stmt->execute([$isim, $yas]);
}

Bu örnekte trim() fonksiyonu ile gereksiz boşluklar atılır, filter_var ile yaşın bir tam sayı olduğu doğrulanır ve ardından güvenli sorgu ile işlem tamamlanır.

Kritik Güvenlik Uyarısı: Veritabanı şifreleri, API anahtarları veya kullanıcı şifreleri gibi hassas verileri asla filtreleme işlemleriyle temizlemeye çalışmayın. Şifreler için her zaman password_hash() ve password_verify() fonksiyonlarını kullanın.

Sıkça Sorulan Sorular

Neden mysql_real_escape_string kullanmamalıyım?

Bu fonksiyon artık PHP'nin güncel sürümlerinde desteklenmemektedir (deprecated). Ayrıca, modern SQL Injection saldırılarına karşı tam koruma sağlamaz; bu yüzden mutlaka PDO veya MySQLi Prepared Statements kullanmalısınız.

Filtreleme işlemini nerede yapmalıyım?

Veri giriş noktasında (controller veya servis katmanı) filtreleme ve doğrulama yapmalı, veriyi ekrana basmadan hemen önce ise XSS koruması için çıktı temizliği yapmalısınız.

Veri temizleme (sanitization) veriyi bozar mı?

Evet, yanlış filtre seçimi verinin içeriğini değiştirebilir. Örneğin, bir e-posta adresini FILTER_SANITIZE_NUMBER_INT ile temizlemeye çalışırsanız, e-posta içindeki harfler kaybolacaktır. Her zaman verinin türüne uygun filtreyi seçin.

XSS saldırısı nedir ve nasıl korunurum?

XSS, kötü niyetli kodların web sayfasına enjekte edilmesidir. Kullanıcıdan gelen her veriyi ekrana basarken htmlspecialchars() kullanarak korunabilirsiniz.

Tüm verileri veritabanına kaydetmeden önce temizlemeli miyim?

Doğrulama (validation) her zaman yapılmalıdır. Temizleme (sanitization) ise verinin türüne göre değişebilir; ancak HTML içeren bir içerik kaydediyorsanız, HTML Purifier gibi gelişmiş kütüphaneler kullanmanız önerilir.

Güvenli Veri Filtreleme İçin İleri Seviye Stratejiler ve Performans Optimizasyonu

Veri filtreleme süreçlerinde güvenlik kadar önemli bir diğer konu da uygulamanın performansıdır. Özellikle yüksek trafikli sistemlerde, her istekte gerçekleştirilen karmaşık doğrulama işlemleri sunucu yükünü artırabilir. Güvenli kod yazarken performans kaybını minimize etmek için aşağıdaki stratejileri izleyebilirsiniz.

Doğrulama ve Temizleme İşlemlerinde Performans Dengesi

Filtreleme işlemlerini gereksiz yere tekrarlamak, CPU kullanımını doğrudan etkiler. Örneğin, bir veriyi veritabanına kaydederken temizlemek ile veriyi görüntülerken temizlemek arasında mimari bir fark vardır. "Input" (giriş) anında temizleme yapmak, veritabanına daha temiz veri girmesini sağlar ancak verinin orijinal halini kaybetmenize neden olabilir. Bu nedenle, veriyi ham haliyle saklayıp, çıktı (output) anında filtrelemek (Output Encoding) genellikle daha esnek ve performanslı bir yaklaşımdır.

// Örnek: Çıktı anında güvenli hale getirme (XSS Koruması)
$kullanici_adi = $veritabanindan_gelen_veri;
echo htmlspecialchars($kullanici_adi, ENT_QUOTES, 'UTF-8');

Hata Ayıklama ve Güvenli Loglama

Veri doğrulama hataları sırasında kullanıcıya çok detaylı hata mesajları göstermek, bir "bilgi ifşası" (information disclosure) zafiyetine yol açabilir. Örneğin, veritabanı bağlantı hatalarını veya SQL sorgu yapısını kullanıcıya göstermek, saldırganlara sisteminiz hakkında ipucu verir. Bunun yerine, hataları sistem loglarına yazmalı ve kullanıcıya genel, anlaşılır mesajlar sunmalısınız.

try {
    $stmt = $pdo->prepare("INSERT INTO kullanicilar (email) VALUES (:email)");
    $stmt->execute(['email' => $email]);
} catch (PDOException $e) {
    // Hatanın detayını log dosyasına yaz
    error_log("Veritabanı hatası: " . $e->getMessage());
    // Kullanıcıya genel bir mesaj göster
    echo "İşlem sırasında bir hata oluştu, lütfen daha sonra tekrar deneyin.";
}

Üçüncü Taraf Kütüphaneler ile Filtreleme

PHP'nin yerleşik filter_var fonksiyonu temel ihtiyaçlar için yeterli olsa da, karmaşık form yapıları ve derinlemesine veri doğrulama gerektiren projelerde "Respect/Validation" veya "Symfony Validator" gibi profesyonel kütüphaneler kullanmak, kodunuzun sürdürülebilirliğini artırır.

Neden Hazır Kütüphaneler Tercih Edilmeli?

  • Zincirleme Doğrulama: Bir alana birden fazla kuralı (örneğin: zorunlu, e-posta formatı, uzunluk sınırı) tek satırda uygulayabilirsiniz.
  • Okunabilirlik: Karmaşık if-else bloklarından kurtularak daha temiz bir kod yapısı elde edersiniz.
  • Güncellik: Güvenlik açıklarına karşı topluluk tarafından sürekli güncellenirler.

Aşağıda, modern bir PHP projesinde doğrulama mantığının nasıl ayrıştırılması gerektiğine dair bir örnek bulunmaktadır:

// İleri seviye doğrulama örneği (Mantıksal yapı)
class KullaniciDogrulayici {
    public function validate(array $data) {
        $errors = [];
        
        if (strlen($data['username']) < 3) {
            $errors[] = "Kullanıcı adı en az 3 karakter olmalıdır.";
        }
        
        if (!filter_var($data['email'], FILTER_VALIDATE_EMAIL)) {
            $errors[] = "Geçersiz e-posta formatı.";
        }
        
        return $errors;
    }
}

Bu yaklaşım, iş mantığınızı (business logic) veritabanı katmanından ayırarak, kodunuzun test edilebilirliğini (unit testing) artırır. Güvenli bir uygulama, sadece saldırıları engelleyen değil, aynı zamanda hataları yönetebilen ve bakımı kolay olan uygulamadır.

Sonuç

PHP ile güvenli veri filtreleme, bir kez yapılıp bırakılacak bir iş değil, bir yazılım geliştirme kültürüdür. Kullanıcı girdilerini her zaman bir tehdit olarak görmeli, filter_var() ile doğrulamalı ve veritabanı etkileşimlerinde mutlaka PDO hazırlanmış ifadelerini kullanmalısınız. Bu adımları uygulayarak, 2026 yılı web standartlarına uygun, saldırılara karşı dirençli uygulamalar geliştirebilirsiniz.

Sorumluluk Reddi: Bu makalede paylaşılan kodlar genel eğitim amaçlıdır. Yazılım güvenliği, uygulamanın mimarisine göre değişiklik gösterebilir. Üretim ortamına geçmeden önce güvenlik testleri (penetrasyon testleri) yapmanız ve güncel güvenlik kütüphanelerini takip etmeniz önerilir.

Bir sonraki adım olarak, uygulamanızda CSRF (Cross-Site Request Forgery) koruması için token yönetimi nasıl yapılır konusunu araştırmanızı öneririm.

Bu yazıya tepkinizi paylaşın:
Zeynep Kaya

Ev yönetimi ve kendin yap (DIY) projeleri konusunda uzmanlaşmış bir içerik üreticisiyim. Detaylı rehberler hazırlayarak okuyucuların evdeki küçük sorunları profesyonel yardıma gerek duymadan çözmelerini sağlıyorum.

Yorumlar (17)

17
okuyucu bu yazı hakkında yorum yaptı. Siz de deneyiminizi paylaşarak diğer okuyuculara yardımcı olabilirsiniz.
Caner Yılmaz
Caner Yılmaz 30 Temmuz 2026

PHP'de filtreleme konusu gerçekten derya deniz. filter_var kullanımıyla ilgili örneklerin çok anlaşılır olmuş, eline sağlık. Özellikle XSS konusunda projelerde hep gözden kaçan detaylar bunlar.

Zeynep Kaya
Zeynep Kaya 01 Ağustos 2026

Değerli yorumun için teşekkür ederim Caner. Evet, filter_var fonksiyonu doğru kullanıldığında işleri çok kolaylaştırıyor.

Selin_Kodlar
Selin_Kodlar 02 Ağustos 2026

Ya ben bu sanitize işlemini yapıyom ama bazen veritabanına kayıt atarken karakter bozulması oluyo. acaba collation ayarlarından mı kaynaklı yoksa filtreleme mi fazla mı kaçıyo?

Emre Berk
Emre Berk 03 Ağustos 2026

Selin muhtemelen karakter setinden kaynaklıdır, veritabanı bağlantı kodunda 'utf8mb4' kullandığından emin ol.

Burak Çelik
Burak Çelik 02 Ağustos 2026

Harika bir özet olmuş. Ben PDO kullanıyorum ama yine de filtreleme yaparken dikkatli olmaya çalışıyorum. Yazdığın teknikleri projeme entegre ettim, güvenlik testlerinde artık daha başarılı sonuçlar alıyorum.

Zeynep Kaya
Zeynep Kaya 04 Ağustos 2026

PDO zaten başlı başına büyük bir güvenlik katmanı, üzerine bu filtreleri de ekleyince çok sağlam olur. Başarılar dilerim!

Mertcan Şahin
Mertcan Şahin 03 Ağustos 2026

Hocam herseyi güzel anlatmışsın da, neden eski yöntemleri (mysql_real_escape_string gibi) hala kullananlar var anlamıyom? Bunların artık çöp olduğunu bir türlü anlatamadım ekibe.

Zeynep Kaya
Zeynep Kaya 04 Ağustos 2026

Alışkanlıklar maalesef zor değişiyor Mertcan. Eğitimlerle veya kod incelemeleriyle onları modern yöntemlere ikna edebilirsin.

Deniz Aras
Deniz Aras 04 Ağustos 2026

Güzel bir yazı olmuş, özellikle yeni başlayanlar için çok açıklayıcı. Peki, resim yükleme gibi dosya işlemlerinde bu filtreler yeterli olur mu yoksa farklı bir kütüphane mi kullanmalıyız?

Zeynep Kaya
Zeynep Kaya 05 Ağustos 2026

Dosya yükleme bambaşka bir dünya Deniz. Sadece filtreleme yetmez, mime-type kontrolü ve dosya ismini yeniden adlandırma gibi önlemler şart.

Hakan Demir
Hakan Demir 05 Ağustos 2026

Yazı güzel ama biraz daha ileri seviye örnekler olsa daha iyi olurmuş. Mesela karmaşık form yapılarında filtreleme stratejileri nasıl olmalı?

Zehra Nur
Zehra Nur 06 Ağustos 2026

Bence de, özellikle validasyon kütüphaneleriyle ilgili bir yazı daha gelse harika olur.

Ayşe Yılmaz
Ayşe Yılmaz 05 Ağustos 2026

Baya faydalı olmuş, teşekkürler. Kod bloklarını kopyalayıp denedim, sorunsuz çalışıyor.

Fatih Terzi
Fatih Terzi 06 Ağustos 2026

Kardeşim harika anlatım, çok saol. Özellikle SQL Injection kısmını okuyunca ne kadar çok açık bıraktığımı farkettim.

Seda K.
Seda K. 06 Ağustos 2026

Yazı için teşekkürler Zeynep hanım. Filtreleme işlemlerini bir sınıfta (class) toplamak mı daha mantıklı yoksa her sayfada ayrı ayrı mı yapmalı?

Zeynep Kaya
Zeynep Kaya 07 Ağustos 2026

Kesinlikle merkezi bir yapıda, yani bir class veya yardımcı fonksiyonlarla yönetmek çok daha sürdürülebilir bir yöntem olur Seda.

Ozan Vural
Ozan Vural 06 Ağustos 2026

Dostum ellerine sağlık, tam ihtiyacım olan zamanda karşıma çıktı. XSS ile başım dertteydi, çözdüm sayesinde.

Yorum Yaz