Files
Youtube2Feed/SECURITY.md

213 lines
5.9 KiB
Markdown
Raw Normal View History

2025-11-13 03:40:05 +03:00
# 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:**
```python
# 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:**
```yaml
# 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:**
```bash
# 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:**
```json
{
"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:**
```json
{
"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:**
```yaml
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:
```yaml
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
```bash
# Bu istek başarısız olmalı (validation hatası)
curl "http://localhost:5000/?channel_id=' OR '1'='1"
```
### 2. XSS Testi
```bash
# Bu istek sanitize edilmeli
curl "http://localhost:5000/?channel_id=<script>alert('XSS')</script>"
```
### 3. Rate Limiting Testi
```bash
# 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.