Adli tıp ve cerrahi mahremiyetinde en katı kurallardan biri, bir hastanın ameliyat sırasındaki anatomik görüntülerinin ve iç organlarının halka açık sergilenememesidir. Bir ameliyathanenin pencereleri buzlu camdır, kapıları kapalıdır.
Şimdi gözünüzün önüne şöyle bir sahne getirin: Cerrah, açık batın ameliyatı yaptığı bir hastanın operasyon salonunun perdelerini sonuna kadar açıyor, hastanenin ana giriş koridorundaki devasa LCD ekranlara canlı yayın veriyor. Ekranda hastanın aort damarının nereden geçtiği, karaciğerindeki gizli bir damar anomalisi, safra kanalının milimetrik koordinatları ve hastanın kimlik numarası sokaktan geçen herkesin gözünün önüne seriliyor. Sokaktaki kötü niyetli bir saldırgan o ekranı izliyor; hastanın en zayıf noktasını, hangi damarının dikiş tutmadığını öğreniyor ve ameliyat sonrasında o noktaya tek bir darbe indirerek hastayı öldürüyor! Hatanın veya iç yapının ortalığa saçılması, saldırgana hedefini altın tepside sunmaktır.
Web güvenliğinde ve yazılım mimarisinde de her gün binlerce web sitesinin siber korsanlara kendi zafiyet haritasını hediye ettiği en acemice ve tehlikeli ihmal tam olarak bu açık yayın skandalıdır: Canlı (production) sunucuda PHP display_errors = On ayarını açık unutmak ve Tam Dizin İfşası (Full Path Disclosure - FPD).
Senaryo kurumsal bir projede veya e-ticaret sitesinde sıkça tekrarlanır. Geliştirici projeyi yerel bilgisayarında kodlarken, kodun neresinde hata olduğunu hemen ekranda görebilmek için PHP'nin hata gösterme özelliğini açmıştır:
Siteye giren sıradan bir kullanıcı normal sayfaları gezerken hiçbir sorun görmez. Fakat siteyi hedef alan bir siber saldırgan veya otomatik bir güvenlik botu, URL'deki parametrelerle oynamaya başlar:
https://sirketadi.com.tr/urun.php?id=9999999999'
Korsan, parametrenin sonuna tek bir tek tırnak (') işareti koyar. Veritabanı sorgusu bozulur, veritabanı boş yanıt döner.
Ve display_errors = On olduğu için, kullanıcının karşısına şık bir "Ürün bulunamadı" sayfası yerine; sayfanın en tepesinde turuncu ve kırmızı harflerle basılmış o korkunç PHP hata çıktısı fırlatır:
Warning: mysqli_fetch_assoc(): Couldn't fetch mysqli_result in /home/ahmet_holding2026/public_html/app/Controllers/ProductController.php on line 142Fatal error: Uncaught Exception: Database query failed. User: u_ahmet_db, Host: 10.0.4.12 in /home/ahmet_holding2026/public_html/system/Database/MySQLi.php:88Stack trace:#0 /home/ahmet_holding2026/public_html/index.php(42): App\Controllers...
Kullanıcı için anlamsız görünen bu 5 satırlık hata çıktısı, bir siber korsan için paha biçilemez bir hazine haritasıdır!
Korsan o tek bir hata mesajını okuyarak sunucu hakkında şunları öğrenmiştir:
İşletim Sistemi ve Kullanıcı Adı: Sunucunun Linux olduğunu ve cPanel kullanıcı adının ahmet_holding2026 olduğunu! Artık SSH brute-force yaparken kullanıcı adı tahmin etmekle uğraşmayacaktır; doğrudan bu kullanıcıyı hedef alacaktır.
Fiziksel Dizin Yapısı (Full Path Disclosure): Web dosyalarının /var/www/ altında değil, /home/ahmet_holding2026/public_html/ altında yaşadığını! Bir LFI (Local File Inclusion) açığı bulduğunda, dosya yolunu körlemesine denemek yerine doğrudan bu yolu hedef alacaktır.
Yazılım Mimarisi ve Framework: Sitenin özel bir MVC yapısı kullandığını, ProductController.php ve MySQLi.php dosyalarının hangi satırlarda ne iş yaptığını!
Veritabanı Kullanıcı Adı ve Dahili IP: Veritabanı kullanıcısının u_ahmet_db olduğunu ve veritabanı sunucusunun yerel ağda 10.0.4.12 IP'sinde barındığını!
Saldırgan tek bir hamle dahi yapmadan, sunucunun tüm iç röntgenini çekmiş; savunmanın en zayıf noktalarını milimetrik olarak haritalandırmıştır.
Gerçek bir yazılım mühendisliğinde canlı ortamda hata gizlemek, hatayı örtbas etmek değil; sistemin mahremiyetini yabancı gözlere karşı mühürlemektir:
Canlıda display_errors Kesinlikle "Off" Olmalıdır:
Canlı sunucunun php.ini dosyasında şu iki kural tavizsiz bir şekilde uygulanmalıdır:
display_errors = Offdisplay_startup_errors = Off
Hataları Ekrana Değil, Dosyaya Yazın (log_errors):
Hataları ziyaretçiden gizlerken, yazılımcının inceleyebilmesi için güvenli bir hata günlüğüne kaydetmek zorunludur:
log_errors = Onerror_log = /var/log/php/error.log ; (Webden erişilemeyen gizli bir dizin!)
Böylece sistemde bir hata olduğunda ziyaretçi hiçbir şey görmez; geliştirici ise SSH ile sunucuya girip hatayı sessizce analiz eder.
Kullanıcı Dostu Hata Sayfaları (Custom 500 Pages):
Uygulamanız beklenmeyen bir hatayla karşılaştığında, ekrana teknik detay basmak yerine zarif ve kurumsal bir sayfa gösterin: "Üzgünüz, teknik bir aksaklık yaşandı. Mühendislerimiz konuyla ilgileniyor."
Hata Takip Servisleri (Sentry / Bugsnag):
Modern uygulamalarda hataları yerel loglardan takip etmek yerine Sentry gibi araçlara entegre edin. Bir hata patladığı saniyede geliştiricinin Slack veya e-posta adresine tüm detaylar şifreli olarak aksın; canlı ekranda tek bir harf bile sızmasın.
Ameliyat masasındaki hastanın iç organlarını caddeye yayınlayan cerrah nasıl bir suç işliyorsa; canlı sunucuda display_errors = On bırakıp tüm dizin haritasını siber saldırganlara sergileyen geliştirici de öyle bir güvenlik ihlali içindedir. Hatalar ekranda değil, güvenli logların karanlığında çözülür. Altyapınızın haritasını düşmana hediye etmeyin; mahremiyet, siber güvenliğin ilk ve en sarsılmaz kalesidir.