213 lines
5.9 KiB
Markdown
213 lines
5.9 KiB
Markdown
|
|
# 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.
|
|||
|
|
|