Güvenlik testi denince çoğu işletme sahibinin aklına siyah ekranda kod yazan biri geliyor. "Bende o kadar iş yok, sitem küçük" diyorsun ve konuyu kapatıyorsun. Oysa bir dijital ürün satış scriptinde ortaya çıkan açıkların ezici bir kısmı romantik hacker işi değil; sıradan bir kullanıcının tarayıcı adres çubuğunda bir sayıyı değiştirmesiyle bulunabilen mantık hataları. Bayi hesabıyla başka bayinin siparişini görmek, sepetteki fiyatı düşürüp ödeme yapmak, aynı stoku iki kez teslim almak gibi.
Bu testlerin hiçbiri özel bir uzmanlık istemiyor. Bir tarayıcı, bir test hesabı, biraz sabır ve sıralı bir kontrol listesi yeterli. Aşağıda kendi e-pin scriptini canlıya almadan veya yeni bir sürüm yayınlamadan önce baştan sona geçebileceğin beş test bloğunu, her birinin nasıl yapıldığını ve "geçti" saymak için hangi sonucu görmen gerektiğini anlatıyorum.
Testten önce: neden canlı sistemde deneme yapmamalısın?
Bu testlerin bir kısmı kasıtlı olarak sistemi kırmaya çalışır. Negatif adet gönderirsin, aynı stoku iki kez teslim almayı denersin, bildirim uçlarına elle istek atarsın. Canlı veride yaparsan muhasebeni bozarsın, gerçek stoku yakarsın ve en kötüsü müşteri siparişine dokunursun. Bu yüzden ilk kural şu: testler bire bir kopyası alınmış bir kurulumda yapılır. Aynı PHP sürümü, aynı veritabanı yapısı, sahte ödeme sağlayıcı anahtarları, uydurma stok kodları.
İkinci kural, her testin sonucunu yazmak. Aklında tuttuğun bulgu kaybolur. Basit bir tablo tut: test adı, beklenen davranış, gözlenen davranış, kritiklik. Bu tablo aynı zamanda geliştiricine veya yazılım sağlayıcına gönderdiğin belge olur ve "bende çalışıyor" tartışmasını bitirir.
Test 1: Yetki sınırları — bayi hesabıyla admin kapısını tıklatıyor musun?
En sık bulunan açık türü yetki kontrolünün eksik kalması. Bunun iki hali var. Birincisi dikey yetki atlama: normal bayi hesabıyla giriş yapıp admin panelinin adresini doğrudan yazmak. Arayüzde o menü görünmese bile sayfanın kendisi yetki kontrolü yapmıyorsa açılır. İkincisi yatay yetki atlama, ki pratikte daha tehlikelidir: bayi A'nın hesabıyla giriş yapıp sipariş detay adresindeki sipariş numarasını bayi B'nin siparişiyle değiştirmek.
Testi şöyle yap: iki ayrı bayi hesabı oluştur, ikisiyle de birer sipariş ver, sonra A'nın oturumundayken B'nin sipariş, fatura, bakiye hareketi ve teslimat adreslerini tek tek dene. Aynısını API uçları için de yap; arayüz kontrol etse bile API ucunun kontrol etmediği durumlar sık görülür. Beklenen sonuç her denemede yetkisiz hatası. "Boş sayfa döndü" cevabı geçti sayılmaz, çünkü boş sayfa bazen sadece şablonun çökmesi demektir.
| Test | Yöntem | Beklenen sonuç | Kritiklik |
|---|---|---|---|
| Dikey yetki atlama | Bayi oturumuyla admin adreslerini aç | 403 / oturum yönlendirme | Kritik |
| Yatay yetki atlama | Başka bayinin sipariş id'sini dene | 403, veri dönmemeli | Kritik |
| Fiyat oynatma | İstekteki tutarı elle düşür | Sunucu fiyatını kullanmalı | Kritik |
| Negatif / ondalık adet | -1 ve 0.5 adet gönder | Doğrulama hatası | Yüksek |
| Callback taklidi | Bildirim ucuna elle istek at | İmza doğrulaması reddetmeli | Kritik |
| Çift teslimat | Aynı stoku iki siparişle çek | Kilit devreye girmeli | Kritik |
| Log / yedek ifşası | Bilinen dosya yollarını dene | 404 veya erişim yok | Yüksek |
| Brute force | 30 hatalı giriş dene | Kilit / gecikme | Orta |
Test 2: Sipariş akışını kırma denemeleri
Bir e-ticaret akışında paranın hesaplandığı yer neresiyse, saldırganın oynamak istediği yer orasıdır. Klasik hata, tutarı istemciden gelen veriye göre işlemek. Sepete ürün ekle, ödeme adımına geç, isteği bir tarayıcı eklentisiyle yakala ve tutarı bir liraya düşür. Sunucu bu tutarı kabul ediyorsa sistemin bitmiştir. Doğru davranış, sunucunun tutarı kendi veritabanındaki güncel fiyattan yeniden hesaplaması ve istemciden gelen tutarı yalnızca doğrulama için kullanması.
Aynı mantığı adet alanında dene: negatif adet bakiye yükleyebiliyor mu, ondalık adet stok sayısını bozuyor mu, aşırı büyük bir sayı taşma yaratıyor mu? Kupon alanında ise tek kullanımlık bir kodu iki farklı sekmede aynı anda kullanmayı dene. Bu yarış koşulu testi, iyi yazılmış bir e-pin satış yazılımında veritabanı seviyesinde kilitle engellenir; zayıf kurgularda ise aynı kupon on kez kullanılabilir.
Kod denetimlerinde bulunan kritik bulguların dağılımı
- Yetki kontrolü eksikliği 40%
- İş mantığı / fiyat doğrulama 30%
- Ödeme bildirimi doğrulaması 18%
- Dosya ve log ifşası 12%
Test 3: Ödeme bildirimini sen mi doğruluyorsun, saldırgan mı?
Ödeme sağlayıcıları başarılı işlemi sana bir bildirim çağrısıyla haber verir. Bu çağrı halka açık bir adrestir; yani teorik olarak herkes o adrese istek atabilir. Testin şu: sağlayıcının gönderdiği isteğin bir kopyasını al, imza alanını boz veya tamamen sil, tutarı büyüt ve isteği kendin gönder. Sipariş "ödendi" oluyor ve stok teslim ediliyorsa, sitenden bedava ürün alınabiliyor demektir.
Doğru akış üç adımlıdır. Birincisi imza doğrulaması: gelen verinin sağlayıcı gizli anahtarıyla üretilmiş özeti kontrol edilir. İkincisi tutar ve para birimi karşılaştırması: bildirimdeki tutar, siparişin kendi kaydındaki tutarla birebir eşleşmelidir. Üçüncüsü tekillik: aynı işlem numarası ikinci kez geldiğinde ikinci teslimat yapılmaz. Bunlardan biri eksikse diğerlerinin varlığı seni kurtarmaz.
İmzayı kontrol etmekle yetinme; siparişin durumunu sağlayıcının sorgu ucundan sen sor. Gelen bildirimi yalnızca "git kontrol et" tetikleyicisi olarak kullanan sistemler, taklit isteklere karşı doğal olarak bağışıktır.
Test 4: Dosya yükleme, yedek ve log ifşası
Bu blok sıkıcı ama en çok gerçek sızıntı buradan çıkıyor. Sırayla dene: sitenin kökünde backup.zip, dump.sql, db.sql.gz, config.php.bak, .env, error_log gibi dosyalar açılıyor mu? Kurulum dizini silinmiş mi, yoksa kurulumu yeniden çalıştırıp veritabanı ayarlarını değiştirmek mümkün mü? Dizin listeleme kapalı mı? Yükleme klasörüne PHP uzantılı bir dosya yüklenebiliyor mu, yüklenirse çalıştırılabiliyor mu?
Yükleme testinde en klasik tuzak, uzantı kontrolünü istemci tarafında yapan sistemler. Dosya adını logo.php.png yapıp gönder, sonra sunucunun kaydettiği gerçek adı ve çalıştırılabilirliğini kontrol et. Sağlam bir dijital ürün satış yazılımı yüklenen dosyanın adını kendisi üretir, uzantıyı beyaz listeyle sınırlar ve yükleme klasöründe kod çalıştırmayı sunucu seviyesinde kapatır.
Test 5: Oturum, kaba kuvvet ve ikinci faktör
Son blok hesap güvenliği. Çıkış yaptıktan sonra eski oturum çerezini geri koyup sayfa açmayı dene; oturum sunucu tarafında gerçekten iptal edilmiş mi? Parola değiştirdikten sonra diğer cihazlardaki oturumlar düşüyor mu? Giriş ekranında otuz hatalı denemeden sonra kilit veya gecikme geliyor mu? Parola sıfırlama bağlantısının süresi var mı, tek kullanımlık mı, kullanılmış bağlantı tekrar işliyor mu?
Yönetici hesapları için ayrıca ikinci faktörü test et. 2FA açıkken yalnızca parola ile giriş yapılabilen bir ara adım var mı, "beni hatırla" seçeneği ikinci faktörü tamamen atlatıyor mu? Bu testleri geçtiğinde temel hijyen tamam demektir. Panel yetki modelinin nasıl kurgulandığını özellikler sayfasında görebilir, kurumsal paketlerdeki denetim özelliklerini fiyat bölümünde karşılaştırabilirsin.
| Kontrol maddesi | Durum ölçütü | Sıklık |
|---|---|---|
| Kurulum dizini silindi | Adres 404 dönüyor | Her kurulumda |
| Yedek dosyası web'den erişilemez | Erişim engellendi | Aylık |
| Hata mesajları gizli | Ekranda yol/sorgu görünmüyor | Her sürümde |
| Yükleme klasöründe kod çalışmıyor | PHP indirilir, çalışmaz | Her sürümde |
| Admin yolu tahmin edilemez | Varsayılan yol kapalı | Her kurulumda |
| 2FA yönetici için zorunlu | Kapatılamıyor | Sürekli |
| Oturum çıkışta iptal ediliyor | Eski çerez çalışmıyor | Her sürümde |
| Kritik işlemler loglanıyor | Kullanıcı, IP, saat var | Sürekli |
| Bağımlılıklar güncel | Bilinen açık yok | Üç aylık |
Bu testleri geçen bir temelden başla
Pinova, yetki modeli, ödeme doğrulaması ve stok kilitleri bu senaryolar düşünülerek kurulmuş bir e-pin yazılımı. Listeyi sıfırdan kendi kodunda kapatmak yerine hazır temeli denetle.
Bu testleri yapmak için yazılımcı olmam gerekir mi?
Çoğu için gerekmez. Yetki atlama, fiyat oynatma ve dosya ifşası testleri tarayıcı ve basit bir istek yakalama aracıyla yapılabilir. Yalnızca ödeme bildirimi testinde bir geliştiriciden destek almak işini kolaylaştırır.
Ne sıklıkla tam tur test yapmalıyım?
Her büyük sürüm güncellemesinde ve en az üç ayda bir. Ayrıca yeni bir ödeme sağlayıcısı, yeni bir bayi API'si veya yeni bir teslimat yöntemi eklediğin her seferde ilgili bloğu tekrar çalıştır.
Bulduğum açığı satıcıya nasıl bildirmeliyim?
Adım adım tekrarlanabilir bir tarif, gözlenen sonuç ve beklenen sonuç yaz. Ekran görüntüsü ekle ama gerçek müşteri verisi paylaşma. İyi bir sağlayıcı bu formatta gelen bildirime günler değil saatler içinde döner.
Sızma testi hizmeti satın almaya değer mi?
Ciroya göre değişir. Aylık hacmin ciddi seviyeye ulaştıysa bağımsız bir denetim iyi yatırım olur. Ancak bu listedeki temel testleri kendin geçmeden dışarıdan denetim almak, parayı bilinen açıkları raporlatmaya harcamak demektir.
Güvenlik, bir kez yapıp bittiği sanılan iş değil; her sürümde tekrarlanan kısa bir rutin. Bu listeyi yazdırıp her güncelleme öncesi tik atarak geçmeye başladığında, sistemindeki sürprizlerin sayısı hızla düşer. Testlerin nasıl bir panelde, hangi yetki katmanlarıyla karşılandığını görmek istersen canlı demo üzerinde bayi ve yönetici hesaplarıyla aynı senaryoları deneyebilir, sonrasında uygun paketi seçebilirsin.

