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

