# Securitate Eventor.ro

## Implementat in Pasul 1 si Pasul 2

- Helmet cu CSP basic.
- Cookie `httpOnly`, `SameSite=Lax`, `secure` cand `APP_URL` este HTTPS.
- Sesiuni salvate in MySQL prin tabela `sessions`.
- CSRF pentru formularele POST.
- Prepared statements prin `mysql2/promise`.
- Hash parole cu `crypto.scrypt`.
- RBAC skeleton centralizat in `src/core/rbac.js`.
- Audit skeleton cu tabela `audit_logs`.
- Rate limit skeleton cu tabela `rate_limits`.
- Checkout-ul nu colecteaza date de card. Viva Wallet se face prin Smart Checkout redirect, iar Eventor verifica tranzactia server-side inainte de emiterea biletelor.
- QR-ul biletului contine token public random; validarea se face server-side prin hash.

## Inainte de productie

- Seteaza `APP_KEY` si `SESSION_SECRET` cu valori lungi, random.
- Schimba sau sterge conturile demo.
- Activeaza SSL in cPanel si seteaza `APP_URL=https://eventor.ro`.
- Verifica permisiunile fisierelor si nu expune `.env`, `src`, `database` sau `storage` in web root.
- Configureaza backup pentru baza de date.
- Verifica logurile din `audit_logs`.
- Configureaza SMTP real doar daca este necesar si nu loga secrete.

## Date personale

Colecteaza minimul necesar pentru comenzi si suport. Exporturile si actiunile administrative trebuie logate in audit in pasii urmatori.

## Festival, cashless si NFC

- Bratarile NFC nu contin date personale, sold sau documente. Payload-ul contine doar cod public, event id, moment emitere si semnatura HMAC.
- Soldul cashless este sursa de adevar doar in baza de date, prin `cashless_transactions`; operatiile folosesc idempotency key si tranzactii cu blocare pe wallet.
- Documentele brute pentru check-in online trebuie pastrate privat, in afara folderului public. Dupa review, sterge sau anonimizeaza documentul brut conform politicii de retentie.
- Scannerul trebuie sa consume doar datele minime din `getScannerSafeCheckinData`; documentul complet nu este expus catre scanner.
- Refundul soldului cashless este limitat de `festival_settings.refund_window_hours`, implicit 48 ore dupa inchiderea ultimei zile de festival.
