Gereksinimler ve Ön Hazırlık
Projenize başlamadan önce bilgisayarınızda bir yerel geliştirme ortamının kurulu olması gerekir. XAMPP, WAMP veya Docker tabanlı bir PHP geliştirme ortamı tercih edebilirsiniz. İhtiyacınız olan temel araçlar şunlardır:
- PHP 8.2 veya üzeri bir sürüm (Performans ve güvenlik güncellemeleri için).
- MySQL veya MariaDB veritabanı sunucusu.
- Veritabanı yönetimi için phpMyAdmin veya bir veritabanı istemcisi.
- Kod düzenleyici olarak Visual Studio Code gibi modern bir editör.
Veritabanı Tablosunun Oluşturulması
İletişim formundan gelen verileri saklamak için öncelikle bir veritabanı ve tabloya ihtiyacımız vardır. Aşağıdaki SQL sorgusu, verilerin tutarlı bir şekilde kaydedilmesi için gerekli olan tablo yapısını oluşturur.
CREATE TABLE iletisim_formu (
id INT AUTO_INCREMENT PRIMARY KEY,
ad_soyad VARCHAR(100) NOT NULL,
eposta VARCHAR(150) NOT NULL,
mesaj TEXT NOT NULL,
tarih TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Bu tablo yapısında, her mesajın benzersiz bir kimliği (id) olacak, gönderen kişinin bilgileri saklanacak ve mesajın gönderildiği zaman otomatik olarak kaydedilecektir.
HTML İletişim Formu Tasarımı
Kullanıcıdan veri almak için standart ve erişilebilir bir HTML formu oluşturmalıyız. Formun method="POST" özelliğine sahip olması, verilerin URL üzerinden değil, HTTP gövdesinde güvenli bir şekilde taşınmasını sağlar.
Gönder
Formdaki required özniteliği, tarayıcı tarafında basit bir doğrulama sağlar. Ancak, sunucu tarafında (PHP) doğrulama yapmak güvenlik için zorunludur.
PHP ile Veritabanı Bağlantısı Kurma
Veritabanı işlemleri için PDO kullanmak, kodun farklı veritabanı sistemlerine taşınabilir olmasını sağlar ve SQL Injection saldırılarına karşı hazırlıklı olmanıza yardımcı olur.
Bu kod bloğu, veritabanına güvenli bir bağlantı açar. try-catch bloğu, bağlantı başarısız olduğunda sistemin çökmesini engeller ve hatayı yakalamanızı sağlar.
Form Verilerini İşleme ve Güvenlik
Formdan gelen verileri doğrudan veritabanına kaydetmek büyük bir güvenlik açığıdır. Gelen verileri temizlemeli ve hazırlıklı ifadeler (prepared statements) kullanmalıyız.
htmlspecialchars fonksiyonu, kullanıcıdan gelen HTML karakterlerini zararsız hale getirir. Hazırlıklı ifadeler (prepare ve execute) ise veritabanı sorgusunu veriden ayırarak SQL Injection riskini sıfıra indirir.
Veri Doğrulama ve Hata Yönetimi Karşılaştırması
| Yöntem | Avantajı | Dezavantajı |
|---|---|---|
| htmlspecialchars | XSS saldırılarını engeller. | Sadece HTML çıktılarını temizler. |
| PDO Prepared Statements | SQL Injection'ı tamamen önler. | Ekstra kod satırı gerektirir. |
| filter_var | E-posta formatını doğrular. | Veritabanı güvenliği için tek başına yetersizdir. |
Kritik Güvenlik Uyarısı: Üretim ortamında (production) asla display_errors = On ayarını açık bırakmayın. Hata mesajları, veritabanı yapınız hakkında saldırganlara ipucu verebilir. Hataları bir log dosyasında tutmak her zaman daha güvenlidir.
Sıkça Sorulan Sorular
PDO kullanmak neden zorunludur?
PDO, veritabanı sorgularını hazırlıklı ifadelerle çalıştırmanıza olanak tanır. Bu, kullanıcıdan gelen verinin kod olarak değil, sadece veri olarak işlenmesini sağlar; böylece SQL Injection saldırıları engellenir.
Form verilerini veritabanına kaydetmeden önce e-posta ile göndermeli miyim?
İletişim formlarında verilerin veritabanında saklanması, ileride analiz yapabilmeniz ve mesajların kaybolmaması için en iyi pratiktir. E-posta bildirimi, veritabanı kaydından sonra ek bir özellik olarak yapılmalıdır.
XSS saldırısı nedir ve nasıl önlenir?
XSS, kullanıcının form alanlarına zararlı JavaScript kodları girmesidir. htmlspecialchars() fonksiyonu, bu karakterleri etkisiz hale getirerek tarayıcının kodu çalıştırmasını engeller.
Veritabanı bağlantı bilgilerini nerede saklamalıyım?
Bağlantı bilgilerini (host, kullanıcı adı, şifre) PHP dosyasının dışında, erişilemeyen bir dizinde veya .env dosyası gibi güvenli yapılandırma dosyalarında tutmalısınız.
Form gönderildikten sonra sayfayı nasıl yenileyebilirim?
Form gönderildikten sonra header("Location: tesekkur.php"); komutunu kullanarak kullanıcıyı başka bir sayfaya yönlendirmek, sayfa yenilendiğinde formun tekrar gönderilmesini engeller.
İleri Düzey İpucu: Form Gönderimlerinde CSRF Koruması
İletişim formunuzu daha güvenli hale getirmek için atmanız gereken en kritik adımlardan biri, CSRF (Cross-Site Request Forgery) saldırılarına karşı koruma sağlamaktır. Bu saldırı türünde, kötü niyetli bir site, sizin formunuzu kullanarak kullanıcının bilgisi dışında veritabanınıza sahte veriler gönderebilir.
Bunu engellemek için her form oturumuna özel, tek kullanımlık bir "token" (belirteç) atamanız gerekir. İşte uygulamanız gereken basit bir yapı:
// Formun oluşturulduğu sayfada token üretin
session_start();
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
// Form içine gizli bir input ekleyin
echo '';
// PHP tarafında kontrol edin
if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
die("Güvenlik hatası: Geçersiz form gönderimi.");
}
Performans Optimizasyonu ve Hata Ayıklama
Veritabanı destekli formlarda, özellikle yüksek trafikli sitelerde performans ve hata yönetimi hayati önem taşır. Hataları kullanıcıya göstermek yerine, sunucu tarafında log dosyalarına kaydetmek hem güvenlik hem de kullanıcı deneyimi açısından daha profesyonel bir yaklaşımdır.
Hata Ayıklama İçin Loglama Sistemi
Veritabanı bağlantı hatalarını veya sorgu hatalarını ekrana yazdırmak, saldırganlara veritabanı yapınız hakkında ipucu verir. Bunun yerine error_log fonksiyonunu kullanarak hataları gizli bir dosyaya kaydedin:
try {
$db = new PDO("mysql:host=localhost;dbname=test", "user", "pass");
} catch (PDOException $e) {
error_log("Veritabanı Hatası: " . $e->getMessage());
die("Üzgünüz, sistemimizde geçici bir sorun oluştu. Lütfen daha sonra tekrar deneyin.");
}
Performans İçin İpuçları
- Sorgu Hazırlığı: PDO
prepare()metodunu kullanarak veritabanı üzerindeki sorgu yükünü optimize edin. - Bağlantı Yönetimi: Her sayfa yüklemesinde yeni bir bağlantı açmak yerine, bağlantıyı bir kez oluşturup gerekli yerlerde çağırın (Singleton deseni).
- Girdi Sınırlandırma: Veritabanına kaydedilecek metin alanları için
mb_strlen()kullanarak maksimum karakter sınırı belirleyin. Bu, veritabanı şişmesini ve gereksiz depolama maliyetlerini engeller.
Test Süreçleri
Formunuzu canlıya almadan önce mutlaka şu senaryoları test edin:
- Boş Gönderim: Tüm alanlar boşken form gönderildiğinde veritabanına kayıt atılmadığından emin olun.
- SQL Injection Denemesi: İsim alanına
' OR '1'='1gibi değerler girerek sistemin hata verip vermediğini kontrol edin. - XSS Denemesi: Mesaj alanına
alert('test')girerek, verinin veritabanına nasıl kaydedildiğini ve ekrana basılırken nasıl filtrelendiğini gözlemleyin.
Sonuç
PHP ile veritabanı destekli bir iletişim formu oluşturmak, temel web güvenliği prensiplerini anlamak için harika bir uygulamadır. Bu rehberde öğrendiğiniz PDO kullanımı, veri temizleme ve hazırlıklı ifadeler, profesyonel projelerinizin temelini oluşturacaktır. Bir sonraki adım olarak, formunuza bir "CAPTCHA" sistemi ekleyerek botların mesaj göndermesini engellemeyi deneyebilirsiniz.
Sorumluluk Reddi: Bu rehberdeki kod örnekleri eğitim amaçlıdır. Canlıya alacağınız projelerde, kullanıcı girdilerini doğrulamak için sunucu tarafında kapsamlı kontroller yapmalı ve uygulamalarınızı güncel güvenlik standartlarına göre denetlemelisiniz.


Yorumlar (0)
Yorum Yaz