# SEC-AVATAR-ACCESS-CONTROL

## Svrha

Korisnički avatari su privatni aplikativni resursi. Web klijent ne dobija putanju iz kolone `users.profile_photo`, već URL oblika `serve_avatar.php?user_id=<ID>`.

## Kontrole

- `serve_avatar.php` zahteva aktivnu autentifikovanu sesiju.
- Endpoint prihvata isključivo pozitivan numerički `user_id` i koristi PDO prepared statement.
- Naziv i putanja fajla određuju se isključivo iz baze.
- `profile_photo_storage_path()` prihvata samo JPG/JPEG/PNG putanju unutar `uploads/avatars` i proverava `realpath()` granicu direktorijuma.
- Ekstenzija mora odgovarati stvarnom tipu slike koji vraća `getimagesize()`.
- Odgovor koristi `X-Content-Type-Options: nosniff`, `Cross-Origin-Resource-Policy: same-origin` i privatnu `no-store` cache politiku.
- Direktan HTTP pristup folderu blokiran je u root `.htaccess` fajlu i u `uploads/avatars/.htaccess` fajlu.

## Poslovna autorizacija

Pre izmene su avatari drugih korisnika bili vidljivi prijavljenim korisnicima na postojećim ekranima. Nova ruta zadržava isto pravilo: svaki aktivan i prijavljen korisnik može da učita avatar aktivnog korisnika preko njegovog internog ID-a. Anonimni korisnici nemaju pristup.

## Nginx ekvivalent

Produkcioni Nginx administrator treba da doda pravilo u odgovarajući `server` blok. Putanju prilagoditi ako je aplikacija instalirana u podfolderu:

```nginx
location ^~ /uploads/avatars/ {
    return 403;
}
```

PHP ruta `serve_avatar.php` mora ostati dostupna kroz postojeću PHP-FPM konfiguraciju. Ne uvoditi `X-Accel-Redirect` bez dodatne privatne lokacije i dokumentovane provere sesije.

## Održavanje

- Ne vraćati direktne `uploads/avatars/...` URL-ove u HTML.
- Ne dodavati parametar koji prihvata naziv ili putanju fajla.
- Ako se uvede novi format slike, istovremeno ažurirati upload validaciju, `profile_photo_stored_path_is_valid()` i MIME mapu u `serve_avatar.php`.
- Posle svake izmene proveriti anonimni pristup, traversal pokušaje, MIME mismatch i prikaz avatara u svim korisničkim komponentama.
