# Varnostne glave za spletne strani: pravilna nastavitev security headers

> Nastavitev varnostnih glav za spletne strani: CSP, HSTS, X-Content-Type-Options in več, s primeri za Nginx in Apache ter preverjanje in tipične napake.

Vir: https://phpsos.de/sl/ratgeber/sicherheits-header/  
Stanje: 25.10.2026  
Ponudnik: PHP SOS, Nujna pomoč za PHP in varnost strežnikov. Takojšnja pomoč po WhatsAppu: https://wa.me/491736494914?text=Pozdravljeni%2C%20PHP%20SOS%2C%20potrebujemo%20pomo%C4%8D%20z%20na%C5%A1im%20stre%C5%BEnikom%20PHP.%20Podjetje%3A%20%E2%80%A6%20Spletna%20stran%3A%20%E2%80%A6

**Na kratko:** Varnostne glave so navodila spletnega strežnika brskalniku, ki obiskovalce ščitijo pred napadi, kot so Cross-Site Scripting, clickjacking in nešifrirane povezave. Najpomembnejše so HSTS, Content Security Policy, X-Content-Type-Options, zaščita pred tujimi okvirji, Referrer-Policy in Permissions-Policy. So smiselno utrjevanje, vendar posodobitev na strežniku ne nadomestijo.

## Kaj varnostne glave zmorejo in česa ne

Ob vsakem priklicu strani spletni strežnik poleg vsebine pošlje tudi glave. Nekatere med njimi krmilijo varnostne funkcije brskalnika. Tako je mogoče na primer določiti, da se stran naloži samo prek HTTPS ali da brskalnik ne izvaja skript s tujih domen.

Za upravljavce je pomembna uvrstitev: glave ščitijo predvsem obiskovalce, na primer pred prestrezanjem sej ali manipuliranimi obrazci. Ranljivosti na strežniku ne zaprejo. Šibkost v PHP, v CMS-ju ali v razširitvi ostane, ne glede na to, kako dobro so glave nastavljene. V sozvočju s čisto kodo pa posledice številnih napak občutno omejijo.

## Najpomembnejše varnostne glave na kratko

| Glava | Namen | Priporočilo kot izhodišče |
|---|---|---|
| Strict-Transport-Security (HSTS) | uveljavi HTTPS za prihodnje priklice | `max-age=31536000; includeSubDomains` |
| Content-Security-Policy (CSP) | določa dovoljene vire za skripte, slike, okvirje | individualno, najprej kot Report-Only |
| X-Content-Type-Options | preprečuje, da brskalnik ugiba tipe datotek | `nosniff` |
| X-Frame-Options oziroma CSP frame-ancestors | preprečuje vdelavo v tuje strani (clickjacking) | `SAMEORIGIN` oziroma `frame-ancestors 'self'` |
| Referrer-Policy | omejuje, kateri naslov se posreduje drugim stranem | `strict-origin-when-cross-origin` |
| Permissions-Policy | izklopi funkcije brskalnika, kot sta kamera ali lokacija | dovolite samo potrebne funkcije |

HSTS nastavite šele, ko so vse poddomene zanesljivo dosegljive prek HTTPS. Brskalnik si navodilo zapomni za navedeni čas; napake tedaj ni mogoče takoj preklicati. Po potrebi začnite s kratkim trajanjem in ga po uspešnih preizkusih povečajte. Dodatna možnost `preload` domeno trajno vpiše na sezname proizvajalcev brskalnikov in naj se nastavi šele po skrbnem preverjanju.

Glave poleg tega niso edino mesto, kjer brskalnik nudi zaščito. Piškotki naj imajo atribute `Secure`, `HttpOnly` in `SameSite`, da seje ni mogoče prestreči prek nešifriranih povezav ali skript. Kako to nastavite v PHP, opisuje vodnik o sejah.

## Nastavitev varnostnih glav v Nginxu

V Nginxu glave sodijo v blok `server` zadevne spletne strani. Dodatek `always` poskrbi, da se pošljejo tudi pri straneh z napakami.

```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: če blok `location` nastavi lastne ukaze `add_header`, se glave iz bloka `server` tam ne prevzamejo. Zato preverite tudi podstrani in statične datoteke. Dodatno utrjevanje za to kombinacijo opisuje stran [Zaščita Nginxa s PHP-FPM](https://phpsos.de/sl/server/nginx-php-fpm/).

## Nastavitev varnostnih glav v Apacheju

Pri Apacheju potrebujete modul `mod_headers`. Ukazi sodijo v VirtualHost ali, če dostopa do njega ni, v `.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` in `ServerSignature` sodita v glavno konfiguracijo. Preprečita, da bi strežnik v odgovorih in straneh z napakami navedel svojo natančno različico. V `php.ini` enako za PHP dosežete z `expose_php = Off`.

## Postopna uvedba Content Security Policy

Content Security Policy je najučinkovitejša, a tudi najzahtevnejša glava. Določa, iz katerih virov se smejo nalagati skripte, slogovne datoteke, slike, pisave in okvirji. Če se vnesena skripta naloži s tuje domene, jo brskalnik blokira.

Sodobne spletne strani pogosto vključujejo orodja za analitiko, ponudnike plačil, kartografske storitve ali videe. Preostro pravilo potem onemogoči funkcije. Zato postopajte po stopnjah:

- Najprej začnite z `Content-Security-Policy-Report-Only`. Brskalnik kršitve sporoča v razvijalski konzoli ali na zbirni naslov, a ničesar ne blokira.
- Zajemite vse potrebne vire in jih ciljno dovolite, namesto da bi uporabljali splošne nadomestne znake.
- Vrstične skripte postopoma prestavite v datoteke ali jih opremite z nonce, da se je mogoče odpovedati `'unsafe-inline'`.
- Šele po preizkusni fazi brez nepričakovanih sporočil preklopite na `Content-Security-Policy`.

> **Nasvet:**
> CSP dopolnjuje čist escaping v kodi, a ga ne nadomesti. Kako pravilno zaščitite izpise v PHP, piše v vodniku [Preprečevanje Cross-Site Scripting v PHP](https://phpsos.de/sl/ratgeber/xss-php/).

## Preverjanje glav in izogibanje tipičnim napakam

Po vsaki spremembi preverite, ali glave dejansko prispejo. To gre brez dodatnih orodij s `curl`:

```bash
# Preizkusite konfiguracijo in znova naložite
nginx -t && systemctl reload nginx

# Prikažite glave začetne strani in 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 napake so podvojene glave, kadar spletni strežnik in aplikacija pošiljata iste glave, predhodni CDN, ki glave odstrani ali prepiše, in glave, ki se pojavijo samo na začetni strani, ne pa pri preusmeritvah ali straneh z napakami. Po posodobitvah CMS-ja ali varnostnih razširitev preverite tudi, ali so se glave spremenile.

Zato določite eno mesto, kjer se glave vzdržujejo, najbolje spletni strežnik ali predhodna storitev. Številne razširitve CMS-jev prav tako ponujajo nastavitve za varnostne glave. To je udobno, a hitro vodi do podvojenih ali nasprotujočih si navedb, če glave dodatno nastavlja še strežnik. Za posamezne preizkuse so primerna tudi razvijalska orodja brskalnika: v zavihku Omrežje vidite glave odgovora za vsako zahtevo, konzola pa prikaže kršitve Content Security Policy.

## Kako PHP SOS pomaga konkretno?

- Preverimo aktualne glave vseh vaših spletnih strani, tudi za CDN in proxyjem, ter pokažemo vrzeli in nasprotja.
- Glave nastavimo osrednje v spletnem strežniku v okviru [utrjevanja strežnika](https://phpsos.de/sl/leistungen/server-haertung/) ter preizkusimo začetno stran, podstrani in strani z napakami.
- Content Security Policy uvedemo v načinu Report-Only, ovrednotimo sporočila in jo po dogovoru aktiviramo.
- Kjer sprememb kode ni mogoče takoj izvesti, zaščito dopolnimo s [pravili WAF in virtualnim popravljanjem](https://phpsos.de/sl/leistungen/waf-virtuelles-patching/).


## Pogosta vprašanja

**Kaj so varnostne glave (security headers)?**  
Varnostne glave so dodatne navedbe v odgovoru spletnega strežnika. Brskalniku na primer sporočijo, naj stran naloži samo prek HTTPS, naj ne izvaja tujih skript ali naj strani ne prikazuje v tujih okvirjih. Ščitijo predvsem obiskovalce.

**Ali varnostne glave ščitijo pred PHP2Shell?**  
Ne. PHP2Shell je ranljivost v PHP na strežniku, glave pa delujejo v brskalniku obiskovalca. Proti PHP2Shell pomaga posodobitev na odpravljeno različico PHP in ponovni zagon vseh workerjev. Glave so dopolnilno utrjevanje za druge vrste napadov.

**Ali lahko Content Security Policy pokvari mojo spletno stran?**  
Da, preostro pravilo blokira potrebne skripte, pisave ali vdelane vsebine. Zato se uvede najprej v načinu Report-Only, ovrednotijo se sporočila in šele nato preklopi na uveljavljanje.

**Ali je X-XSS-Protection še smiseln?**  
Ne. Aktualni brskalniki te glave ne ovrednotijo več, priporočilo pa se glasi, da jo izpustite ali nastavite na 0. Zaščito pred Cross-Site Scriptingom nudita čist escaping v kodi in Content Security Policy.

## Viri

- [OWASP Cheat Sheet Series (HTTP Headers)](https://cheatsheetseries.owasp.org/)
- [OWASP Top 10](https://owasp.org/www-project-top-ten/)
- [BSI: priporočila za spletne strežnike](https://www.bsi.bund.de/)
