# Sigurnosna zaglavlja za web-stranice: ispravno postavljanje

> Postavljanje sigurnosnih zaglavlja web-stranice: CSP, HSTS, X-Content-Type-Options i više, s primjerima za Nginx i Apache te provjerom i tipičnim pogreškama.

Izvor: https://phpsos.de/hr/ratgeber/sicherheits-header/  
Stanje: 25.10.2026  
Pružatelj: PHP SOS, PHP hitna pomoć i sigurnost poslužitelja. Hitna pomoć putem WhatsAppa: https://wa.me/491736494914?text=Pozdrav%20PHP%20SOS%2C%20trebamo%20pomo%C4%87%20s%20na%C5%A1im%20PHP%20poslu%C5%BEiteljem.%20Tvrtka%3A%20%E2%80%A6%20Web-stranica%3A%20%E2%80%A6

**Ukratko:** Sigurnosna zaglavlja su upute web-poslužitelja pregledniku koje štite posjetitelje od napada poput cross-site scriptinga, clickjackinga i nešifriranih veza. Najvažnija su HSTS, Content-Security-Policy, X-Content-Type-Options, zaštita od tuđih okvira, Referrer-Policy i Permissions-Policy. Smisleno su ojačavanje, ali ne zamjenjuju ažuriranja na poslužitelju.

## Što sigurnosna zaglavlja postižu, a što ne

Pri svakom pozivu stranice web-poslužitelj uz sadržaj šalje i zaglavlja. Neka od njih upravljaju sigurnosnim funkcijama preglednika. Tako se primjerice može odrediti da se stranica učitava samo preko HTTPS-a ili da preglednik ne izvršava skripte s tuđih domena.

Za operatere je važno razvrstavanje: zaglavlja štite ponajprije posjetitelje, primjerice od presretanja sesija ili manipuliranih obrazaca. Ne zatvaraju ranjivosti na poslužitelju. Slabost u PHP-u, u CMS-u ili u ekstenziji ostaje, koliko god dobro zaglavlja bila postavljena. U kombinaciji s urednim kodom, međutim, znatno ograničavaju posljedice mnogih pogrešaka.

## Najvažnija sigurnosna zaglavlja ukratko

| Zaglavlje | Svrha | Preporuka kao polazište |
|---|---|---|
| Strict-Transport-Security (HSTS) | nameće HTTPS za buduće pozive | `max-age=31536000; includeSubDomains` |
| Content-Security-Policy (CSP) | određuje dopuštene izvore za skripte, slike, okvire | individualno, najprije kao Report-Only |
| X-Content-Type-Options | sprječava da preglednik pogađa vrste datoteka | `nosniff` |
| X-Frame-Options odnosno CSP frame-ancestors | sprječava ugradnju u tuđe stranice (clickjacking) | `SAMEORIGIN` odnosno `frame-ancestors 'self'` |
| Referrer-Policy | ograničava koja se adresa prenosi drugim stranicama | `strict-origin-when-cross-origin` |
| Permissions-Policy | isključuje funkcije preglednika poput kamere ili lokacije | dopustiti samo potrebne funkcije |

HSTS biste trebali postaviti tek kad su sve poddomene pouzdano dostupne preko HTTPS-a. Preglednik pamti uputu za navedeno vrijeme; pogrešku tada nije moguće odmah povući. Po potrebi počnite s kratkim trajanjem i povećajte ga nakon uspješnih testova. Dodatna opcija `preload` trajno upisuje domenu u popise proizvođača preglednika i treba je postaviti tek nakon pažljive provjere.

Zaglavlja uz to nisu jedino mjesto na kojem preglednik nudi zaštitu. Kolačići bi trebali nositi atribute `Secure`, `HttpOnly` i `SameSite` kako se sesije ne bi presretale preko nešifriranih veza ili skripti. Kako to postaviti u PHP-u, opisuje vodič o sesijama.

## Postavljanje sigurnosnih zaglavlja u Nginxu

U Nginxu zaglavlja pripadaju u `server` blok pojedine web-stranice. Dodatak `always` osigurava da se šalju i na stranicama s pogreškama.

```nginx
server {
    # ...
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;
    add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
    add_header Content-Security-Policy-Report-Only "default-src 'self'; img-src 'self' data:; object-src 'none'; base-uri 'self'; frame-ancestors 'self'; form-action 'self'" always;

    server_tokens off;
}
```

Posebnost Nginxa: ako `location` blok postavlja vlastite `add_header` naredbe, zaglavlja iz `server` bloka tamo se ne preuzimaju. Zato provjerite i podstranice i statične datoteke. Daljnje ojačavanje za tu kombinaciju opisuje [Zaštita Nginxa s PHP-FPM-om](https://phpsos.de/hr/server/nginx-php-fpm/).

## Postavljanje sigurnosnih zaglavlja u Apacheu

Na Apacheu trebate modul `mod_headers`. Naredbe pripadaju u VirtualHost ili, ako nemate pristup, u `.htaccess`.

```apache
<IfModule mod_headers.c>
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
    Header always set X-Content-Type-Options "nosniff"
    Header always set X-Frame-Options "SAMEORIGIN"
    Header always set Referrer-Policy "strict-origin-when-cross-origin"
    Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()"
    Header always set Content-Security-Policy-Report-Only "default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'"
</IfModule>

ServerTokens Prod
ServerSignature Off
```

`ServerTokens` i `ServerSignature` pripadaju u glavnu konfiguraciju. Sprječavaju da poslužitelj u odgovorima i stranicama s pogreškama navodi svoju točnu verziju. U `php.ini` isto za PHP postižete s `expose_php = Off`.

## Postupno uvođenje Content-Security-Policy

Content-Security-Policy je najučinkovitije, ali i najzahtjevnije zaglavlje. Određuje iz kojih se izvora smiju učitavati skripte, stilovi, slike, fontovi i okviri. Ako se ubačena skripta naknadno učitava s tuđe domene, preglednik je blokira.

Moderne web-stranice često ugrađuju alate za analitiku, pružatelje plaćanja, usluge karata ili videe. Prestroga politika tada onesposobljava funkcije. Zato postupajte u koracima:

- Najprije započeti s `Content-Security-Policy-Report-Only`. Preglednik prijavljuje povrede u konzoli za razvojne programere ili na zbirnu adresu, ali ništa ne blokira.
- Zabilježiti sve potrebne izvore i ciljano ih odobriti, umjesto da se koriste paušalni zamjenski znakovi.
- Inline skripte postupno izdvojiti u datoteke ili opremiti nonceovima kako bi se moglo odustati od `'unsafe-inline'`.
- Tek nakon probne faze bez neočekivanih poruka prijeći na `Content-Security-Policy`.

> **Savjet:**
> CSP dopunjuje uredan escaping u kodu, ali ga ne zamjenjuje. Kako ispravno osigurati izlaze u PHP-u, nalazi se u vodiču [Sprječavanje cross-site scriptinga u PHP-u](https://phpsos.de/hr/ratgeber/xss-php/).

## Provjera zaglavlja i izbjegavanje tipičnih pogrešaka

Nakon svake promjene provjerite stižu li zaglavlja zaista. To ide bez dodatnih alata s `curl`:

```bash
# Testirati konfiguraciju i ponovno učitati
nginx -t && systemctl reload nginx

# Prikazati zaglavlja početne stranice i jedne statične datoteke
curl -sI https://www.example.de/ | grep -iE 'strict|content-security|x-content|x-frame|referrer|permissions|server'
curl -sI https://www.example.de/favicon.ico | grep -iE 'strict|x-content'
```

Tipične pogreške su dvostruko postavljena zaglavlja kad web-poslužitelj i aplikacija šalju ista zaglavlja, CDN ispred koji uklanja ili prepisuje zaglavlja te zaglavlja koja se pojavljuju samo na početnoj stranici, ali ne kod preusmjeravanja ili stranica s pogreškama. Provjerite i nakon ažuriranja CMS-a ili sigurnosnih ekstenzija jesu li se zaglavlja promijenila.

Zato odredite jedno mjesto na kojem se zaglavlja održavaju, najbolje web-poslužitelj ili usluga ispred. Mnoge CMS ekstenzije također nude postavke za sigurnosna zaglavlja. To je zgodno, ali lako vodi do dvostrukih ili proturječnih podataka ako zaglavlja dodatno postavlja i poslužitelj. Za pojedinačne testove prikladni su i alati za razvojne programere u pregledniku: u kartici mreže uz svaki zahtjev vidite zaglavlja odgovora, a konzola prikazuje povrede Content-Security-Policy.

## Kako PHP SOS konkretno pomaže?

- Provjeravamo aktualna zaglavlja svih Vaših web-stranica, i iza CDN-a i proxyja, te pokazujemo praznine i proturječja.
- Zaglavlja postavljamo središnje u web-poslužitelju u okviru [ojačavanja poslužitelja](https://phpsos.de/hr/leistungen/server-haertung/) i testiramo početnu stranicu, podstranice i stranice s pogreškama.
- Content-Security-Policy uvodimo u načinu Report-Only, analiziramo poruke i nakon dogovora je aktiviramo.
- Gdje izmjene koda nisu odmah moguće, zaštitu dopunjujemo [WAF pravilima i virtualnim zakrpanjem](https://phpsos.de/hr/leistungen/waf-virtuelles-patching/).


## Česta pitanja

**Što su sigurnosna zaglavlja?**  
Sigurnosna zaglavlja dodatni su podaci u odgovoru web-poslužitelja. Pregledniku primjerice kažu da stranicu smije učitati samo preko HTTPS-a, da ne smije izvršavati strane skripte ili da stranicu ne smije prikazati u tuđim okvirima. Štite ponajprije posjetitelje.

**Štite li sigurnosna zaglavlja od PHP2Shella?**  
Ne. PHP2Shell je ranjivost u PHP-u na poslužitelju, a zaglavlja djeluju u pregledniku posjetitelja. Protiv PHP2Shella pomaže ažuriranje na ispravljenu verziju PHP-a i ponovno pokretanje svih workera. Zaglavlja su dopunsko ojačavanje za druge vrste napada.

**Može li Content Security Policy pokvariti moju web-stranicu?**  
Da, prestroga politika blokira potrebne skripte, fontove ili ugrađene sadržaje. Zato se najprije uvodi u načinu Report-Only, analiziraju se poruke i tek se tada prelazi na provedbu.

**Je li X-XSS-Protection još smislen?**  
Ne. Aktualni preglednici više ne analiziraju to zaglavlje, a preporuka je izostaviti ga ili postaviti na 0. Zaštitu od cross-site scriptinga pružaju uredan escaping u kodu i Content Security Policy.

## Izvori

- [OWASP Cheat Sheet Series (HTTP Headers)](https://cheatsheetseries.owasp.org/)
- [OWASP Top 10](https://owasp.org/www-project-top-ten/)
- [BSI: preporuke za web-poslužitelje](https://www.bsi.bund.de/)
