5.9 KiB
5.9 KiB
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:
UCile 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: nosniffX-Frame-Options: DENYX-XSS-Protection: 1; mode=blockStrict-Transport-Security: max-age=31536000; includeSubDomainsContent-Security-Policy: default-src 'self'
Güvenlik Best Practices
1. API Key Yönetimi
- Production'da mutlaka değiştirin:
config/security.yamldosyası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.