
# Checklist de Sécurité - Mise à jour finale

## 1. Sécurité des Formulaires

### Formulaire de Contact (`routers.ts` -> `contact.submit`)
- [x] **Validation** : Zod (`email`, `min(3)`, `min(20)`).
- [x] **Sanitation** : `sanitizeInput` appliqué sur `name`, `message` (escape HTML), `email` et `phone`.
- [x] **Rate Limiting** : Protection globale tRPC (`60 req/min`) + Global API (`300 req/min`).
- [x] **CSRF** : `checkOrigin` appliqué via `securityMiddleware` sur toutes les mutations.

### Administration - Portfolio (`routers.ts` -> `portfolio.create`, `portfolio.update`)
- [x] **Auth Check** : `ctx.user.role === 'admin'` vérifié.
- [x] **Validation** : Zod schemas stricts.
- [x] **Sanitation** : `sanitizeInput` appliqué sur `title`, `description`, `clientName`, `testimonial`, etc.
- [x] **SQL Injection** : Utilisation de Drizzle ORM (requêtes préparées).

### Administration - Blog (`routers.ts` -> `blog.create`, `blog.update`)
- [x] **Auth Check** : `ctx.user.role === 'admin'` vérifié.
- [x] **Validation** : Zod schemas.
- [x] **Sanitation** : `sanitizeInput` sur `title`, `excerpt`, `content` (Markdown sûr), `author`, `seo*`.
- [x] **SQL Injection** : Drizzle ORM.

### Authentification (`routers/auth.ts` -> `login`, `register`)
- [x] **Rate Limiting Strict** : `5 essais / 15 min` sur le login.
- [x] **Timing Attack** : Comparaison hash factice si utilisateur non trouvé.
- [x] **Hashing** : Bcrypt utilisé pour les mots de passe.
- [x] **JWT** : Signé avec secret, stocké en cookie `HttpOnly`.

## 2. Sécurité Globale Serveur

### Headers HTTP (`_core/index.ts`)
- [x] **HSTS** : `Strict-Transport-Security` activé en production.
- [x] **CSP** : `Content-Security-Policy` stricte (`default-src 'self'`).
- [x] **XSS Check** : `X-XSS-Protection: 1; mode=block`.
- [x] **NoSniff** : `X-Content-Type-Options: nosniff`.
- [x] **Frame Options** : `SAMEORIGIN` (anti-clickjacking).

### Middleware
- [x] **Rate Limiter Global** : `300 req/min` par IP sur `/api`.
- [x] **Body Parser** : Limite `50mb` configurée (attention au DoS potentiel sur gros uploads, mais nécessaire pour images).

## 3. Vecteurs Bloqués Spécifiques

- **XSS Stocké** : Bloqué par `sanitizeInput` (échappement des caractères spéciaux HTML avant DB).
- **XSS Réfléchi** : Bloqué par l'encodage par défaut de React + Sanitation + CSP.
- **CSRF** : Bloqué par vérification de l'origine (`Origin` / `Referer`) sur les mutations.
- **Brute Force Login** : Bloqué par le rate limiter strict (5 tentatives).
- **SQL Injection** : Bloqué par conception (Drizzle ORM).
