QA için Güvenlik Testi: Yeni Başlayanlardan Uzmanlara

Güvenlik hatalarını adım adım bulmayı öğrenin — güvenlik deneyimi gerekli değil!


🎯 Bu Makale Kimin İçin?

Bu makale şunlar için hazırlandı:

  • Yeni başlayanlar — güvenlik testi hakkında hiçbir şey bilmeyenler
  • QA mühendisleri — güvenlik becerileri eklemek isteyenler
  • Geliştiriciler — güvenlik testine ilgi duyanlar
  • Öğrenciler — web güvenliği öğrenenler

Ön bilgi gerekmiyor! Her şeyi basit benzetmelerle sıfırdan açıklayacağız.


📍 Buradasınız:

[✓] Makale 1: QA Temelleri
[✓] Makale 2: QA Pratiği  
[✓] Makale 3: QA için DSA
[✓] Makale 4: Otomasyon Framework'leri
[✓] Makale 5: CI/CD
[✓] Makale 6: Test Tasarım Teknikleri
[✓] Makale 7: Performans Testi
[✓] Makale 8: Apple'da İş Bulmak
[→] Makale 9: Güvenlik Testi

İlerleme: %100 + Bonus ✨

🏠 Güvenlik Testi Nedir? (Basit Açıklama)

Uygulamanızın bir ev olduğunu düşünün:

Evin ParçasıUygulamadaTehdit
🚪 Ön kapıGiriş formu (login)Şifre kırma
🪟 PencerelerAPI endpoint’leriYetkisiz erişim
🔐 KasaVeritabanıVeri hırsızlığı
📮 Posta kutusuGiriş formlarıKötü amaçlı kod enjeksiyonu
🎥 KameralarLog kayıtlarıSaldırganları takip etme

Güvenlik testi = evin tüm “kapı ve pencerelerini” kontrol ederek saldırganın giremeyeceğinden emin olmak! 🏠🔒


📚 Yeni Başlayanlar İçin Güvenlik Testi

Adım 1: Temel Terimleri Anlayın

TerimBasit AçıklamaGünlük Hayattan Örnek
Zafiyetİstismar edilebilecek zayıf noktaKilitlenmemiş kapı
ExploitZafiyeti kullanma yöntemiKilitlenmemiş kapıdan girmek
Kimlik Doğrulama”Kim olduğunuz” kontrolüKimlik göstermek
Yetkilendirme”Ne yapabileceğiniz” kontrolüBina geçiş kartı
ŞifrelemeVeriyi okunamaz koda çevirmeGizli dil
HTTPSGüvenli bağlantıVeriler için zırhlı araç
SQL InjectionGiriş yoluyla DB komutları enjekte etmeBelge sahteciliği
XSSSayfaya script enjekte etmeİlanların değiştirilmesi

Adım 2: TÜM Güvenlik Testçilerinin Kontrol Ettiği Üç Şey

1. 🔐 KİMLİK DOĞRULAMA - Şifre olmadan giriş yapabilir miyim?
2. 🎫 YETKİLENDİRME - Yapmamam gereken şeyleri yapabilir miyim?
3. 📝 VERİ GİRİŞİ - Garip girişlerle sistemi kırabilir miyim?

Adım 3: İlk Güvenlik Testiniz! 🎯

Bunu herhangi bir test sitesinde deneyin (İZİN olmadan ASLA gerçek sitelerde denemeyin!):

Alıştırma: Erişim Kontrolü Testi

1. İki hesap oluşturun (Kullanıcı A ve Kullanıcı B)
2. Kullanıcı A olarak giriş yapın
3. ID içeren bir URL bulun (örn: /profile/123 veya /order/456)
4. ID'yi başka bir numaraya değiştirmeyi deneyin
5. Kullanıcı B'nin verilerini görüyorsanız — zafiyet buldunuz! 🐛

🔟 OWASP Top 10 — Basitçe Açıklanmış

OWASP (Open Web Application Security Project), en tehlikeli 10 güvenlik açığının listesini oluşturdu. İşte basit açıklamalar:

#İsim5 Yaşındakilere AçıklamaEv Benzetmesi
A01Bozuk Erişim Kontrolü”Başkasının odasına girdim!”Bir oda anahtarı tüm odaları açıyor
A02Kriptografik Hatalar”Sırlar şifresiz saklanıyor”Buzdolabına yapıştırılmış şifre notu
A03Enjeksiyonlar”Metin kutusunda kötü komutlar”Postada “tüm parayı ver” notu
A04Güvensiz Tasarım”Ev kilitsiz inşa edilmiş”Mimar kapıları unutmuş
A05Yanlış Yapılandırma”Anahtarı paspasın altında bıraktılar”Varsayılan “admin” şifresi
A06Güncel Olmayan Bileşenler”Eski kırık kilit”YouTube’da nasıl açılacağı videosu olan 1950 kilidi
A07Kimlik Sorunları”Kimliği kontrol etmediler”Soru sormadan herkesi içeri aldılar
A08Bütünlük İhlali”Birisi ürünleri değiştirdi”Teslimattan gelen zehirli yemek
A09Loglama Eksikliği”Güvenlik kamerası yok”Hırsız geldi ve fark edilmeden gitti
A10İstek Sahteciliği (SSRF)“Hizmetçiyi kötü şey yapmaya kandırdılar”Patrondan sahte emir

📚 Daha fazla öğrenmek ister misiniz? Laboratuvarlar, gerçek dünya örnekleri ve pratik alıştırmalar içeren Makale 10: OWASP Top 10 Derinlemesine İnceleme’ye göz atın!


QA Mühendisleri Neden Güvenlik Testini Bilmeli

Günümüz dünyasında güvenlik herkesin sorumluluğundadır. Bir QA mühendisi olarak, zaten hata bulmada ustasınız — güvenlik açıkları ciddi sonuçları olan özel bir hata kategorisidir.

Neden önemli:

  • 🔓 Veri ihlalleri şirketlere milyonlara mal oluyor
  • 💼 Güvenlik becerileri piyasa değerinizi %30-50 artırır
  • 🎯 Birçok şirket QA’dan temel güvenlik kontrolleri bekliyor
  • 🏆 Güvenlik hatası bulmak = yüksek etkili katkılar

Bölüm 1: OWASP Top 10 - Detaylı

1. Bozuk Erişim Kontrolü (A01:2021)

Basitçe ne demek: Bir otel düşünün; 101 numaralı odanızın anahtarı aniden TÜM odaları açıyor. İşte bu bozuk erişim kontrolü! 🏨

Teknik olarak ne: Kullanıcılar erişememeleri gereken kaynaklara erişebilir veya yapmamaları gereken eylemleri gerçekleştirebilir.

Kendiniz deneyin (güvenli alıştırma):

1. Test sitesine gidin ve içinde sayı olan bir URL bulun:
   https://example.com/profile/123
   
2. Sayıyı değiştirmeyi deneyin:
   https://example.com/profile/124
   https://example.com/profile/1
   
3. Başkasının verilerini görüyorsanız — bu IDOR zafiyeti! 🐛

Nasıl test edilir:

✓ URL'lerdeki ID'leri değiştirerek diğer kullanıcıların verilerine erişmeye çalışın
✓ Yatay yetki yükseltme testi yapın (kullanıcı A → kullanıcı B'nin verileri)
✓ Dikey yetki yükseltme testi yapın (kullanıcı → admin işlemleri)
✓ İstekleri değiştirerek erişim kontrollerini atlayıp atlamayacağınızı kontrol edin

Örnek test senaryoları:

# Test: Kullanıcı başka bir kullanıcının profiline erişebilir mi?
# Orijinal URL: /api/users/123/profile
# Değiştir: /api/users/456/profile

# Test: Normal kullanıcı admin endpoint'lerine erişebilir mi?
# Dene: /api/admin/users (normal kullanıcı olarak)

# Test: IDOR (Insecure Direct Object Reference)
def test_idor_vulnerability():
    # Kullanıcı A olarak giriş yap
    response = client.get("/api/orders/1001")  # Kullanıcı A'nın siparişi
    assert response.status_code == 200
    
    # Kullanıcı B'nin siparişine erişmeye çalış
    response = client.get("/api/orders/1002")  # Kullanıcı B'nin siparişi
    assert response.status_code == 403  # Yasak olmalı!

2. Kriptografik Hatalar (A02:2021)

Basitçe ne demek: Bu, kasanın şifresini kasaya yapıştırılmış bir notta saklamak gibi. Veri var ama koruma yok! 📝

Teknik olarak ne: Hassas verilerin uygun şifreleme ile korunamaması.

Nasıl test edilir:

✓ Hassas verilerin HTTPS üzerinden iletilip iletilmediğini kontrol edin
✓ Şifrelerin hash'lendiğini doğrulayın (düz metin olarak saklanmadığını)
✓ URL'lerde, loglarda veya hata mesajlarında hassas veri olup olmadığını kontrol edin
✓ Eski/zayıf şifreleme algoritmalarının kullanılıp kullanılmadığını test edin

Kontrol listesi:

AlanNe Kontrol Edilmeli
HTTPSTüm sayfalar HTTPS kullanıyor, karışık içerik yok
Şifrelerbcrypt/Argon2 ile hash’lenmiş, asla loglanmıyor
API Anahtarlarıİstemci tarafı kodunda açığa çıkmıyor
ÇerezlerSecure & HttpOnly bayrakları ayarlı
BaşlıklarHSTS etkin

3. Enjeksiyon (A03:2021)

Nedir: Güvenilmeyen veriler bir komut veya sorgunun parçası olarak bir yorumlayıcıya gönderilir.

Enjeksiyon türleri:

  • SQL Injection - Veritabanı sorguları
  • XSS - Tarayıcı scriptleri
  • Command Injection - İşletim sistemi komutları
  • LDAP Injection - Dizin servisleri

SQL Injection Test Senaryoları:

-- Test için temel SQL injection payload'ları:
' OR '1'='1
' OR '1'='1' --
'; DROP TABLE users; --
' UNION SELECT username, password FROM users --

-- Arama alanlarında, giriş formlarında, URL parametrelerinde

Pratikte test:

# Giriş formunu SQL injection için test et
def test_sql_injection_login():
    payloads = [
        "' OR '1'='1",
        "admin'--",
        "' OR 1=1--",
        "1; DROP TABLE users",
    ]
    
    for payload in payloads:
        response = client.post("/login", data={
            "username": payload,
            "password": "anything"
        })
        # Injection ile giriş YAPMAMALI
        assert "Hoşgeldiniz" not in response.text
        assert response.status_code != 200

4. Güvensiz Tasarım (A04:2021)

Nedir: Tasarım aşamasında eksik veya etkisiz güvenlik kontrolleri.

Nasıl test edilir:

✓ İş mantığını güvenlik açıkları için inceleyin
✓ Hassas işlemlerde hız sınırlamasını test edin
✓ Eksik güvenlik gereksinimlerini kontrol edin
✓ Tehdit modellemesinin yapılıp yapılmadığını doğrulayın

Örnek senaryolar:

Senaryo: Doğrulama olmadan şifre sıfırlama
  Herhangi bir e-posta için şifre sıfırlama istediğimde
  Sıfırlama bağlantısını aldığımda
  E-posta erişimi olmadan şifre sıfırlayamamalıyım

Senaryo: Sınırsız giriş denemeleri
  Giriş formu mevcut olduğunda
  100 yanlış şifre denediğimde
  Hesap kilitlenmeli veya hız sınırlanmalı

5. Güvenlik Yanlış Yapılandırması (A05:2021)

Nedir: Güvensiz varsayılan yapılandırmalar, eksik kurulumlar veya ayrıntılı hata mesajları.

Nasıl test edilir:

✓ Varsayılan kimlik bilgilerini kontrol edin
✓ Gereksiz etkin özellikleri arayın
✓ Hata mesajlarının bilgi sızdırmadığını doğrulayın
✓ Güvenlik başlıklarını kontrol edin

Güvenlik Başlıkları Kontrol Listesi:

# Gerekli güvenlik başlıkları
Strict-Transport-Security: max-age=31536000; includeSubDomains
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
Content-Security-Policy: default-src 'self'
X-XSS-Protection: 1; mode=block
Referrer-Policy: strict-origin-when-cross-origin

curl ile test:

# Güvenlik başlıklarını kontrol et
curl -I https://yoursite.com | grep -E "(Strict|X-Content|X-Frame|Content-Security|X-XSS)"

6. Savunmasız ve Eski Bileşenler (A06:2021)

Nedir: Bilinen güvenlik açıkları olan kütüphaneler, framework’ler veya bileşenler kullanmak.

Nasıl test edilir:

# NPM projeleri
npm audit

# Python projeleri
pip-audit
safety check

# Belirli CVE'leri kontrol et
# Snyk, OWASP Dependency-Check veya GitHub Dependabot kullanın

7. Kimlik Doğrulama ve Tanımlama Hataları (A07:2021)

Nedir: Saldırganların kullanıcı hesaplarını ele geçirmesine izin veren zayıf kimlik doğrulama mekanizmaları.

Nasıl test edilir:

✓ Zayıf şifre politikalarını test edin
✓ Oturum yönetimini kontrol edin (zaman aşımı, geçersiz kılma)
✓ MFA uygulamasını doğrulayın
✓ "Beni hatırla" işlevini test edin
✓ Şifre sıfırlama akışını kontrol edin

Test senaryoları:

def test_weak_password_allowed():
    # Zayıf şifrelere izin vermemeli
    weak_passwords = ["123456", "password", "qwerty", "abc123"]
    
    for pwd in weak_passwords:
        response = client.post("/register", data={
            "username": "testuser",
            "password": pwd
        })
        assert "Şifre çok zayıf" in response.text

def test_session_fixation():
    # Girişten önce oturumu al
    session_before = client.cookies.get('session_id')
    
    # Giriş yap
    client.post("/login", data={"username": "user", "password": "pass"})
    
    # Oturum girişten sonra değişmeli
    session_after = client.cookies.get('session_id')
    assert session_before != session_after

8. Yazılım ve Veri Bütünlüğü Hataları (A08:2021)

Nedir: Bütünlük ihlallerine karşı koruma sağlamayan kod ve altyapı.

Nasıl test edilir:

✓ Yazılım güncellemelerinin güvenilir kaynaklardan geldiğini doğrulayın
✓ CI/CD pipeline güvenliğini kontrol edin
✓ Güvensiz deserializasyonu test edin
✓ Güncellemelerdeki dijital imzaları doğrulayın

9. Güvenlik Loglama ve İzleme Hataları (A09:2021)

Nedir: Saldırıların tespit edilmemesine izin veren yetersiz loglama ve izleme.

Nasıl test edilir:

✓ Başarısız giriş denemelerinin loglandığını doğrulayın
✓ Güvenlik olaylarının uyarılandığını kontrol edin
✓ Log bütünlüğünü test edin (kurcalama yok)
✓ PII'nin loglanmadığını doğrulayın

Ne loglanmalı:

OlayÖncelik
Başarısız giriş denemeleriYüksek
Erişim kontrolü hatalarıYüksek
Girdi doğrulama hatalarıOrta
Admin işlemleriYüksek
Şifre değişiklikleriOrta

10. Sunucu Tarafı İstek Sahteciliği (SSRF) (A10:2021)

Nedir: Uygulama, kullanıcı tarafından sağlanan URL’yi doğrulamadan uzak kaynak getirir.

Nasıl test edilir:

# URL giriş alanlarında SSRF testi
ssrf_payloads = [
    "http://localhost/admin",
    "http://127.0.0.1:22",
    "http://169.254.169.254/latest/meta-data/",  # AWS metadata
    "file:///etc/passwd",
    "http://internal-server.local/",
]

def test_ssrf_prevention():
    for payload in ssrf_payloads:
        response = client.post("/fetch-url", data={"url": payload})
        assert response.status_code == 400
        assert "Geçersiz URL" in response.text

Bölüm 2: Temel Güvenlik Testi Teknikleri

2.1 Girdi Doğrulama Testi

Altın Kural: Kullanıcı girdisine asla güvenmeyin!

# Kapsamlı girdi doğrulama test paketi
class TestInputValidation:
    
    # XSS Payload'ları
    xss_payloads = [
        "<script>alert('XSS')</script>",
        "<img src=x onerror=alert('XSS')>",
        "javascript:alert('XSS')",
        "<svg onload=alert('XSS')>",
        "'-alert('XSS')-'",
        "<body onload=alert('XSS')>",
    ]
    
    # SQL Injection Payload'ları
    sqli_payloads = [
        "' OR '1'='1",
        "1; DROP TABLE users--",
        "' UNION SELECT * FROM users--",
        "1' AND '1'='1",
    ]
    
    # Path Traversal Payload'ları
    path_payloads = [
        "../../../etc/passwd",
        "....//....//....//etc/passwd",
        "%2e%2e%2f%2e%2e%2f%2e%2e%2fetc/passwd",
    ]
    
    def test_xss_in_all_inputs(self, all_input_fields):
        for field in all_input_fields:
            for payload in self.xss_payloads:
                response = submit_form(field, payload)
                assert payload not in response.text
                assert html.escape(payload) in response.text or \
                       "Geçersiz girdi" in response.text

2.2 Kimlik Doğrulama Testi

class TestAuthentication:
    
    def test_brute_force_protection(self):
        """Hesap kilitlemenin çalıştığını test et"""
        for i in range(10):
            response = login("admin", f"wrong_password_{i}")
        
        # Hesap kilitlenmiş olmalı
        response = login("admin", "correct_password")
        assert "Hesap kilitlendi" in response.text
    
    def test_password_complexity(self):
        """Şifre gereksinimlerini test et"""
        weak_passwords = [
            ("short", "Çok kısa"),
            ("alllowercase", "Büyük harf gerekli"),
            ("ALLUPPERCASE", "Küçük harf gerekli"),
            ("NoNumbers!", "Rakam gerekli"),
            ("NoSpecial123", "Özel karakter gerekli"),
        ]
        
        for password, expected_error in weak_passwords:
            response = register(password=password)
            assert expected_error in response.text
    
    def test_session_expiration(self):
        """Oturumların süresinin dolduğunu test et"""
        token = login_and_get_token()
        
        # Oturum zaman aşımını bekle (veya zamanı mock'la)
        time.sleep(SESSION_TIMEOUT + 1)
        
        response = access_protected_resource(token)
        assert response.status_code == 401

2.3 Yetkilendirme Testi (Erişim Kontrolü)

class TestAuthorization:
    
    def test_horizontal_privilege_escalation(self):
        """Kullanıcı A, Kullanıcı B'nin verilerine erişememeli"""
        # Kullanıcı A olarak giriş yap
        token_a = login("user_a", "password_a")
        
        # Kullanıcı A'nın siparişini al
        response = get_order(token_a, order_id=100)  # Kullanıcı A'nın siparişi
        assert response.status_code == 200
        
        # Kullanıcı B'nin siparişine erişmeye çalış
        response = get_order(token_a, order_id=200)  # Kullanıcı B'nin siparişi
        assert response.status_code == 403
    
    def test_vertical_privilege_escalation(self):
        """Normal kullanıcı admin işlevlerine erişememeli"""
        user_token = login("regular_user", "password")
        
        admin_endpoints = [
            "/api/admin/users",
            "/api/admin/settings",
            "/api/admin/logs",
        ]
        
        for endpoint in admin_endpoints:
            response = client.get(endpoint, headers={"Authorization": user_token})
            assert response.status_code == 403
    
    def test_idor_in_api(self):
        """Insecure Direct Object References testi"""
        user_token = login("user1", "password")
        
        # Kendi profiline erişebilmeli
        response = client.get("/api/users/1/profile", 
                             headers={"Authorization": user_token})
        assert response.status_code == 200
        
        # Başkasının profiline erişememeli
        response = client.get("/api/users/2/profile",
                             headers={"Authorization": user_token})
        assert response.status_code == 403

2.4 API Güvenlik Testi

class TestAPISecurity:
    
    def test_rate_limiting(self):
        """API hız sınırlaması olmalı"""
        responses = []
        for i in range(100):
            response = client.get("/api/search?q=test")
            responses.append(response.status_code)
        
        # Limitten sonra 429 (Too Many Requests) görmeliyiz
        assert 429 in responses
    
    def test_api_versioning(self):
        """Eski API sürümleri deprecated olmalı"""
        response = client.get("/api/v1/users")  # Eski sürüm
        assert response.status_code == 410  # Gone
    
    def test_sensitive_data_exposure(self):
        """API hassas alanları açığa çıkarmamalı"""
        response = client.get("/api/users/1")
        user_data = response.json()
        
        sensitive_fields = ["password", "ssn", "credit_card", "api_key"]
        for field in sensitive_fields:
            assert field not in user_data
    
    def test_mass_assignment(self):
        """Kullanıcılar admin alanlarını ayarlayamamalı"""
        response = client.put("/api/users/1", json={
            "name": "John",
            "role": "admin",  # Göz ardı edilmeli
            "is_verified": True  # Göz ardı edilmeli
        })
        
        user = get_user(1)
        assert user["role"] != "admin"
        assert user["is_verified"] != True

Bölüm 3: Güvenlik Testi Araçları

3.1 Tarayıcı Geliştirici Araçları

Ne bulabilirsiniz:

  • localStorage/sessionStorage’daki hassas veriler
  • JavaScript dosyalarındaki API anahtarları
  • Güvensiz çerezler (eksik Secure/HttpOnly bayrakları)
  • Karışık içerik uyarıları
  • CSP ihlalleri
// Tarayıcı depolamasındaki hassas verileri kontrol et
console.log("LocalStorage:", localStorage);
console.log("SessionStorage:", sessionStorage);
console.log("Cookies:", document.cookie);

// window nesnesindeki açığa çıkmış API anahtarlarını kontrol et
Object.keys(window).filter(k => 
  k.toLowerCase().includes('key') || 
  k.toLowerCase().includes('token') ||
  k.toLowerCase().includes('secret')
);

3.2 Burp Suite (Temel Araç)

QA için temel özellikler:

  1. Proxy - İstekleri yakala ve değiştir
  2. Repeater - İstekleri tekrar oynat ve değiştir
  3. Intruder - Payload’larla otomatik test
  4. Scanner - Otomatik zafiyet tespiti

Temel iş akışı:

1. Tarayıcıyı Burp proxy kullanacak şekilde yapılandırın (127.0.0.1:8080)
2. Uygulamayı normal şekilde gezinin
3. Proxy > HTTP history'de istekleri inceleyin
4. İlginç istekleri Repeater'a gönderin
5. Zafiyetleri test etmek için değiştirin ve tekrar gönderin

3.3 OWASP ZAP (Ücretsiz Alternatif)

# CI/CD için headless modda ZAP çalıştır
docker run -t owasp/zap2docker-stable zap-baseline.py \
  -t https://yoursite.com \
  -r report.html

3.4 Komut Satırı Araçları

# Nikto - Web sunucu tarayıcısı
nikto -h https://yoursite.com

# SQLMap - SQL injection testi
sqlmap -u "https://yoursite.com/search?q=test" --batch

# Nmap - Ağ taraması
nmap -sV -sC yoursite.com

# SSLyze - SSL/TLS testi
sslyze yoursite.com

# Güvenlik başlıklarını kontrol et
curl -I https://yoursite.com | grep -iE "strict|x-frame|x-content|csp|x-xss"

3.5 CI/CD’de Otomatik Güvenlik Testi

# GitHub Actions örneği
name: Security Tests

on: [push, pull_request]

jobs:
  security:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      
      # Bağımlılık taraması
      - name: Run npm audit
        run: npm audit --audit-level=high
      
      # SAST (Statik Analiz)
      - name: Run Semgrep
        uses: returntocorp/semgrep-action@v1
      
      # DAST (Dinamik Analiz)
      - name: Run OWASP ZAP
        uses: zaproxy/action-baseline@v0.7.0
        with:
          target: 'https://staging.yoursite.com'
      
      # Gizli bilgi taraması
      - name: Run Gitleaks
        uses: gitleaks/gitleaks-action@v2

Bölüm 4: Güvenlik Testi Kontrol Listesi

Yayın Öncesi Güvenlik Kontrol Listesi

## Kimlik Doğrulama ve Oturum Yönetimi
- [ ] Güçlü şifre politikası uygulanıyor
- [ ] Başarısız denemelerden sonra hesap kilitleme
- [ ] Oturum zaman aşımı uygulandı
- [ ] Çıkışta oturum geçersiz kılma
- [ ] Güvenli oturum token'ı oluşturma
- [ ] Hassas hesaplar için MFA mevcut

## Yetkilendirme
- [ ] Rol tabanlı erişim kontrolü çalışıyor
- [ ] Yatay yetki yükseltme yok
- [ ] Dikey yetki yükseltme yok
- [ ] API endpoint'leri düzgün korunuyor
- [ ] Admin işlevleri kısıtlı

## Girdi Doğrulama
- [ ] Tüm girdiler sunucu tarafında doğrulanıyor
- [ ] SQL injection test edildi ve engellendi
- [ ] XSS test edildi ve engellendi
- [ ] Dosya yükleme kısıtlamaları mevcut
- [ ] Path traversal engellendi

## Veri Koruma
- [ ] Her yerde HTTPS (karışık içerik yok)
- [ ] Hassas veriler durumda şifreli
- [ ] URL'lerde hassas veri yok
- [ ] Şifreler düzgün hash'leniyor
- [ ] PII loglanmıyor

## Güvenlik Başlıkları
- [ ] HSTS etkin
- [ ] X-Content-Type-Options: nosniff
- [ ] X-Frame-Options: DENY
- [ ] Content-Security-Policy ayarlı
- [ ] Referrer-Policy yapılandırıldı

## Hata İşleme
- [ ] Kullanıcılara genel hata mesajları
- [ ] Üretimde stack trace yok
- [ ] Hatalarda hassas bilgi yok

## Bağımlılıklar
- [ ] Bilinen zafiyet yok
- [ ] Bağımlılıklar güncel
- [ ] Lisans uyumluluğu kontrol edildi

Bölüm 5: Gerçek Dünya Güvenlik Hatası Örnekleri

Örnek 1: E-ticarette IDOR

Hata: Tahmin edilebilir URL'ler aracılığıyla sipariş detayları açığa çıkıyor
Şiddet: Yüksek
URL: /api/orders/12345

Yeniden üretme adımları:
1. Kullanıcı A olarak giriş yapın
2. Siparişinizi görüntüleyin: /api/orders/100
3. URL'yi değiştirin: /api/orders/101 (başka kullanıcının siparişi)
4. Gözlemleyin: Diğer kullanıcının sipariş detayları görünüyor

Etki: Herhangi bir kimliği doğrulanmış kullanıcı herhangi bir siparişi görüntüleyebilir,
      kişisel verileri, adresleri, ödeme bilgilerini açığa çıkarır

Düzeltme: Siparişin kimliği doğrulanmış kullanıcıya ait olduğunu doğrulayın

Örnek 2: Aramada SQL Injection

Hata: Ürün aramasında SQL Injection
Şiddet: Kritik
URL: /search?q=

Yeniden üretme adımları:
1. Arama sayfasına gidin
2. Girin: ' OR '1'='1' --
3. Gözlemleyin: Tüm ürünler döndürüldü (SQL çalıştırıldı)
4. Girin: ' UNION SELECT username, password FROM users --
5. Gözlemleyin: Kullanıcı kimlik bilgileri açığa çıktı

Etki: Tam veritabanı erişimi, veri ihlali

Düzeltme: Parametreli sorgular kullanın

Örnek 3: Kullanıcı Profilinde XSS

Hata: Profil bio alanında Stored XSS
Şiddet: Yüksek
Konum: Kullanıcı profili bio

Yeniden üretme adımları:
1. Profil ayarlarına gidin
2. Bio girin: <script>alert(document.cookie)</script>
3. Profili kaydedin
4. Profili görüntüleyin (herhangi bir kullanıcı olarak)
5. Gözlemleyin: JavaScript çalışıyor

Etki: Oturum ele geçirme, hesap ele geçirme

Düzeltme: Çıktıyı temizleyin, CSP uygulayın

Bölüm 6: Güvenlik Testi Mülakat Soruları

Yaygın Sorular ve Cevaplar

S: Kimlik doğrulama ve yetkilendirme arasındaki fark nedir?

Kimlik Doğrulama: KİM olduğunuzu doğrulama (kimlik)
  - Kullanıcı adı/şifre, MFA, biyometri
  
Yetkilendirme: NE yapabileceğinizi doğrulama (izinler)
  - Rol kontrolleri, erişim kontrol listeleri

S: SQL Injection’ı ve nasıl önleneceğini açıklayın.

SQL Injection: Kullanıcı girdisi aracılığıyla kötü amaçlı SQL ekleme

Önleme:
1. Parametreli sorgular kullanın (prepared statements)
2. ORM framework'leri kullanın
3. Girdi doğrulama ve temizleme
4. Veritabanı için en az yetki

Örnek (Python):
# Kötü (savunmasız)
query = f"SELECT * FROM users WHERE id = {user_id}"

# İyi (parametreli)
query = "SELECT * FROM users WHERE id = ?"
cursor.execute(query, (user_id,))

S: XSS nedir ve türleri nelerdir?

XSS (Cross-Site Scripting): Kötü amaçlı scriptler enjekte etme

Türler:
1. Stored XSS - Script veritabanında saklanır
2. Reflected XSS - Script URL'de, geri yansıtılır
3. DOM XSS - Script doğrudan DOM'u manipüle eder

Önleme:
- Çıktı kodlama
- Content Security Policy (CSP)
- Girdi doğrulama
- HttpOnly çerezler

S: Bozuk erişim kontrolünü nasıl test edersiniz?

1. IDOR testi - URL/API'lerde ID'leri değiştirin
2. Yatay yükseltme testi - Diğer kullanıcıların verilerine erişim
3. Dikey yükseltme testi - Admin işlevlerine erişim
4. Eksik işlev düzeyi erişim kontrolü testi
5. JWT/token manipülasyonu testi
6. Path traversal testi

Bölüm 7: Güvenlik Testi Becerilerinizi Geliştirme

Öğrenme Yolu

Seviye 1: Temeller (Hafta 1-2)
├── OWASP Top 10
├── Temel web güvenlik kavramları
├── Güvenlik için tarayıcı DevTools
└── HTTP/HTTPS temelleri

Seviye 2: Araçlar (Hafta 3-4)
├── Burp Suite temelleri
├── OWASP ZAP
├── Komut satırı araçları
└── Tarayıcı eklentileri

Seviye 3: Pratik (Hafta 5-8)
├── OWASP WebGoat
├── Damn Vulnerable Web Application (DVWA)
├── HackTheBox
├── PortSwigger Web Security Academy
└── Bug bounty programları (önce sadece okuma)

Seviye 4: Entegrasyon (Hafta 9-12)
├── CI/CD'de güvenlik
├── Tehdit modelleme
├── Güvenlik gereksinimleri
└── Güvenlik otomasyonu

Ücretsiz Kaynaklar

KaynakTürBağlantı
OWASP WebGoatPratikhttps://owasp.org/www-project-webgoat/
PortSwigger AcademyÖğrenmehttps://portswigger.net/web-security
HackTheBoxCTFhttps://www.hackthebox.com/
TryHackMeÖğrenmehttps://tryhackme.com/
OWASP Testing GuideRehberhttps://owasp.org/www-project-testing/

Özet

QA mühendisi olarak güvenlik testini beceri setinize eklemek:

Değerinizi artırır - Güvenlik becerileri yüksek talep görüyor
Ürün kalitesini artırır - Hackerlardan önce hataları bulun
Kullanıcıları korur - Veri ihlallerini ve kimlik hırsızlığını önleyin
Kariyerinizi ilerletir - Güvenlik rollerine kapılar açar

Temel çıkarımlar:

  1. OWASP Top 10’u ezberleyin
  2. Savunmasız uygulamalarla pratik yapın
  3. Test planlarınıza güvenlik kontrollerini ekleyin
  4. Burp Suite ve ZAP gibi araçları kullanın
  5. CI/CD’de güvenlik testlerini otomatikleştirin

Sırada Ne Var?

Öğrenme yolculuğunuza devam edin:

  • 🔒 Sertifika alın: CompTIA Security+, CEH, OSCP
  • 🐛 Bug bounty programlarına katılın: HackerOne, Bugcrowd
  • 📚 Okuyun: “The Web Application Hacker’s Handbook”
  • 🛠️ Her gün CTF zorluklarıyla pratik yapın

Unutmayın: Güvenlik tek seferlik bir aktivite değildir. Her test aktivitesinin parçası olması gereken bir zihniyettir!


Mutlu (etik) hackleme! 🔐