Files
Youtube2Feed/SECURITY.md
2025-11-13 03:40:05 +03:00

5.9 KiB
Raw Permalink Blame History

Güvenlik Dokümantasyonu

Bu dokümantasyon, YouTube Transcript RSS Feed projesinin güvenlik önlemlerini açıklar.

Güvenlik Özellikleri

1. SQL Injection Koruması

  • Parametrize Queries: Tüm SQL sorguları parametrize edilmiş query'ler kullanır
  • Input Validation: Veritabanına giden tüm inputlar format kontrolünden geçer
  • Video ID Validation: YouTube video ID formatı kontrol edilir (11 karakter, alfanumerik)
  • Channel ID Validation: YouTube channel ID formatı kontrol edilir (UC ile başlayan 24 karakter)

Örnek:

# Güvenli (parametrize query)
cursor.execute("SELECT * FROM videos WHERE video_id = ?", (video_id,))

# Güvensiz (kullanılmıyor!)
# cursor.execute(f"SELECT * FROM videos WHERE video_id = '{video_id}'")

2. XSS (Cross-Site Scripting) Koruması

  • Input Sanitization: Tüm kullanıcı inputları sanitize edilir
  • HTML Tag Removal: Tehlikeli HTML tag'leri kaldırılır
  • Script Tag Removal: <script> tag'leri ve JavaScript event handler'ları temizlenir
  • Length Limits: Input uzunlukları sınırlandırılır

Özellikler:

  • HTML tag'leri kaldırılır: <script>, <iframe>, vb.
  • JavaScript event handler'ları temizlenir: onclick=, onerror=, vb.
  • Maksimum uzunluk sınırları: channel_id (50), channel_url (200), vb.

3. API Key Authentication (Opsiyonel)

API key sistemi ile endpoint'lere erişim kontrolü sağlanabilir.

Yapılandırma:

# config/security.yaml
security:
  require_api_key: false  # true yaparak zorunlu hale getir
  api_keys:
    your_api_key_here:
      name: "My API Key"
      rate_limit: 100  # Dakikada maksimum istek
      enabled: true

Kullanım:

# Header ile
curl -H "X-API-Key: your_api_key_here" http://localhost:5000/

# Query parametresi ile
curl "http://localhost:5000/?channel_id=UC...&api_key=your_api_key_here"

4. Rate Limiting

  • IP Bazlı Rate Limiting: IP adresine göre istek limiti
  • API Key Bazlı Rate Limiting: API key'e özel rate limit
  • Endpoint Bazlı Limitler: Her endpoint için farklı limitler

Varsayılan Limitler:

  • Ana feed endpoint (/): 60 istek/dakika
  • Health check (/health): 120 istek/dakika
  • Info endpoint (/info): 120 istek/dakika

Rate Limit Header'ları:

X-RateLimit-Remaining: 45

Rate Limit Aşıldığında:

{
  "error": "Rate limit aşıldı",
  "message": "Dakikada 60 istek limiti",
  "retry_after": 60
}

HTTP Status: 429 Too Many Requests

5. Input Validation

Tüm endpoint'lerde input validation yapılır:

  • Channel ID: UC ile başlayan 24 karakter
  • Channel Handle: Alfanumerik karakterler, maksimum 30 karakter
  • Channel URL: Sadece YouTube URL'lerine izin verilir
  • max_items: 1-500 arası sayı

Geçersiz Input Örneği:

{
  "error": "Geçersiz channel_id formatı",
  "message": "Channel ID UC ile başlayan 24 karakter olmalı"
}

6. CORS (Cross-Origin Resource Sharing)

CORS ayarları config/security.yaml dosyasından yapılandırılabilir.

Varsayılan:

cors:
  enabled: true
  allowed_origins: ["*"]  # Production'da spesifik domain'ler belirtilmeli
  allowed_methods: ["GET", "OPTIONS"]
  allowed_headers: ["Content-Type", "X-API-Key"]

7. Security Headers

Tüm response'lara güvenlik header'ları eklenir:

  • X-Content-Type-Options: nosniff
  • X-Frame-Options: DENY
  • X-XSS-Protection: 1; mode=block
  • Strict-Transport-Security: max-age=31536000; includeSubDomains
  • Content-Security-Policy: default-src 'self'

Güvenlik Best Practices

1. API Key Yönetimi

  • Production'da mutlaka değiştirin: config/security.yaml dosyasındaki demo key'leri değiştirin
  • Güçlü key'ler kullanın: En az 32 karakter, rastgele oluşturulmuş
  • Key rotation: Düzenli olarak API key'leri değiştirin
  • Key'leri güvenli saklayın: Git'e commit etmeyin, environment variable kullanın

2. Rate Limiting

  • Production için uygun limitler belirleyin: Trafiğe göre ayarlayın
  • API key bazlı limitler: Farklı kullanıcılar için farklı limitler
  • Monitoring: Rate limit aşımlarını loglayın

3. Input Validation

  • Her zaman validate edin: Tüm kullanıcı inputlarını validate edin
  • Whitelist yaklaşımı: Sadece izin verilen formatları kabul edin
  • Length limits: Maksimum uzunluk sınırları koyun

4. SQL Injection

  • Parametrize queries: Her zaman parametrize query kullanın
  • Input validation: Veritabanına giden tüm inputları validate edin
  • Error handling: Hata mesajlarında hassas bilgi göstermeyin

5. XSS Koruması

  • Output encoding: Feedgen otomatik encoding yapar
  • Input sanitization: Tüm inputları sanitize edin
  • Content Security Policy: CSP header'ları kullanın

Güvenlik Yapılandırması

Güvenlik ayarları config/security.yaml dosyasından yönetilir:

security:
  require_api_key: false
  api_keys:
    your_key:
      name: "Key Name"
      rate_limit: 100
      enabled: true
  default_rate_limit: 60
  cors:
    enabled: true
    allowed_origins: ["*"]
  security_headers:
    X-Content-Type-Options: "nosniff"
    # ...

Güvenlik Testleri

1. SQL Injection Testi

# Bu istek başarısız olmalı (validation hatası)
curl "http://localhost:5000/?channel_id=' OR '1'='1"

2. XSS Testi

# Bu istek sanitize edilmeli
curl "http://localhost:5000/?channel_id=<script>alert('XSS')</script>"

3. Rate Limiting Testi

# 60+ istek gönder, 429 hatası almalı
for i in {1..70}; do curl "http://localhost:5000/?channel_id=UC..."; done

Güvenlik Güncellemeleri

  • Düzenli olarak bağımlılıkları güncelleyin: pip install --upgrade
  • Güvenlik açıklarını takip edin: GitHub Security Advisories
  • Log'ları izleyin: Şüpheli aktiviteleri tespit edin

İletişim

Güvenlik açığı bulursanız, lütfen sorumlu disclosure yapın.