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

213 lines
5.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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.