# Güvenlik Notları

## Gizli değerler

- `.env` dosyasını `public/` içine koymayın.
- `.env`, MySQL yedeği ve erişim anahtarı teslim kayıtlarını herkese açık depoya yüklemeyin.
- `AUTH_TOKEN_PEPPER` en az 32 rastgele karakter olmalıdır.
- MySQL kullanıcısında uygulamanın ihtiyaç duymadığı global yetkileri vermeyin.
- Production ortamında `DB_DRIVER=memory` kullanmayın.

## Erişim anahtarları

- Anahtar düz metni yalnızca oluşturma komutunun çıktısında görünür.
- Veritabanında pepper ile güçlendirilmiş özet saklanır.
- Kaybolan anahtar kurtarılamaz; iptal edilip yenisi oluşturulur.
- Kullanıcılar anahtarlarını paylaşmamalıdır.
- Yetki kaldırıldığında anahtarı `access:revoke` ile iptal edin veya kullanıcıyı pasif yapın.

## Uygulama katmanı

Uygulama şu korumaları uygular:

- Parametrik MySQL sorguları
- Transaction ve `SELECT ... FOR UPDATE` ile moderasyon kararı
- Aynı testçinin aynı bölüme ikinci oyuna SQL unique kısıtı
- Mükerrer bulmaca yapısına SQL unique kısıtı
- Rol tabanlı üretici/testçi kontrolü
- Üreticinin kendi bölümünü test etmesini engelleme
- Çözmeden geri bildirim göndermeyi engelleme
- JSON içerik tipi ve istek boyutu kontrolü
- Origin kontrolü
- Rate limiting
- CSP, X-Frame-Options, nosniff ve diğer güvenlik başlıkları
- API yanıtlarını PWA cache'inin dışında tutma
- Çözüm yıldızlarını public/test kuyruğu liste yanıtlarında göndermeme
- Çözümleyici worker, süre, node ve kuyruk sınırları

## HTTPS ve proxy

- Canlı kullanımda HTTPS zorunlu tutulmalıdır.
- `APP_ORIGIN` gerçek HTTPS adresi olmalıdır.
- cPanel Passenger veya ters proxy arkasında `TRUST_PROXY=true` kullanılabilir.
- SSL aktif değilken HSTS açılmamalıdır; SSL aktif olduktan sonra `ENABLE_HSTS=true` kullanılmalıdır.

## Loglama

- Erişim anahtarlarını, `.env` değerlerini veya MySQL parolasını loglamayın.
- Hata yanıtlarında istemciye stack trace gönderilmez.
- Sunucu tarafındaki `request_id` değerleriyle hataları ilişkilendirin.
- cPanel loglarını yalnızca yetkili hesapların okuyabildiğini doğrulayın.

## Güncelleme ve yedek

- Her release öncesinde MySQL ve `.env` yedeği alın.
- `package-lock.json` ile kurulum yapın: `npm ci --omit=dev --ignore-scripts`.
- Bağımlılık güvenlik bildirimlerini bakım dönemlerinde inceleyin.
- Node.js desteklenen bir sürümde tutulmalıdır.
- Migration geri dönüş planı olmadan canlı veritabanında değişiklik yapmayın.

## Olay halinde

1. Etkilenen erişim anahtarlarını iptal edin.
2. Gerekirse `AUTH_TOKEN_PEPPER` değiştirerek bütün anahtarları geçersiz kılın.
3. MySQL kullanıcı parolasını değiştirin.
4. cPanel ve uygulama loglarını koruyup inceleyin.
5. Temiz yedekten geri dönüş gerekip gerekmediğini belirleyin.
6. Yetkili topluluk kullanıcılarına yeniden anahtar verin.
