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