# Security Header pre weby: správne nastaviť bezpečnostné hlavičky

> Nastaviť Security Header pre weby: CSP, HSTS, X-Content-Type-Options a ďalšie s ukážkami pre Nginx a Apache, plus kontrola a typické chyby.

Zdroj: https://phpsos.de/sk/ratgeber/sicherheits-header/  
Stav: 25.10.2026  
Poskytovateľ: PHP SOS, Núdzová pomoc pri PHP a bezpečnosť serverov. Okamžitá pomoc cez WhatsApp: https://wa.me/491736494914?text=Dobr%C3%BD%20de%C5%88%2C%20PHP%20SOS%2C%20potrebujeme%20pomoc%20s%20na%C5%A1%C3%ADm%20serverom%20s%20PHP.%20Spolo%C4%8Dnos%C5%A5%3A%20%E2%80%A6%20Web%3A%20%E2%80%A6

**Stručne:** Security Header sú pokyny webového servera pre prehliadač, ktoré chránia návštevníkov pred útokmi ako Cross-Site-Scripting, clickjacking a nešifrované spojenia. Najdôležitejšie sú HSTS, Content-Security-Policy, X-Content-Type-Options, ochrana pred cudzími rámami, Referrer-Policy a Permissions-Policy. Sú zmysluplným spevnením, ale nenahrádzajú aktualizácie na serveri.

## Čo Security Header dokážu a čo nie

Pri každom zobrazení stránky posiela webový server popri obsahu aj hlavičky. Niektoré z nich riadia bezpečnostné funkcie prehliadača. Možno tak napríklad určiť, že sa stránka načíta iba cez HTTPS alebo že prehliadač nevykonáva skripty z cudzích domén.

Pre prevádzkovateľov je dôležité zaradenie: hlavičky chránia v prvom rade návštevníkov, napríklad pred zachytením relácií alebo pred zmanipulovanými formulármi. Neuzatvárajú zraniteľnosti na serveri. Slabina v PHP, v CMS alebo v rozšírení zostáva, bez ohľadu na to, ako dobre sú hlavičky nastavené. V súhre s čistým kódom však výrazne obmedzujú následky mnohých chýb.

## Najdôležitejšie Security Header v prehľade

| Hlavička | Účel | Odporúčanie ako východisko |
|---|---|---|
| Strict-Transport-Security (HSTS) | vynucuje HTTPS pre budúce zobrazenia | `max-age=31536000; includeSubDomains` |
| Content-Security-Policy (CSP) | určuje povolené zdroje pre skripty, obrázky, rámy | individuálne, najprv ako Report-Only |
| X-Content-Type-Options | bráni prehliadaču hádať typy súborov | `nosniff` |
| X-Frame-Options, resp. CSP frame-ancestors | bráni vloženiu do cudzích stránok (clickjacking) | `SAMEORIGIN`, resp. `frame-ancestors 'self'` |
| Referrer-Policy | obmedzuje, ktorá adresa sa odovzdáva iným stránkam | `strict-origin-when-cross-origin` |
| Permissions-Policy | vypína funkcie prehliadača ako kamera alebo poloha | povoliť iba potrebné funkcie |

HSTS by ste mali nastaviť až vtedy, keď sú všetky subdomény spoľahlivo dostupné cez HTTPS. Prehliadač si pokyn pamätá po uvedený čas; chyba sa potom nedá hneď vziať späť. Prípadne začnite s krátkou dobou platnosti a po úspešných testoch ju predĺžte. Dodatočná voľba `preload` zapíše doménu trvalo do zoznamov výrobcov prehliadačov a mala by sa nastaviť iba po starostlivej kontrole.

Hlavičky navyše nie sú jediným miestom, kde prehliadač poskytuje ochranu. Cookies by mali mať atribúty `Secure`, `HttpOnly` a `SameSite`, aby sa relácie nedali zachytiť cez nešifrované spojenia alebo skripty. Ako to v PHP nastaviť, popisuje príručka o session.

## Nastaviť Security Header v Nginx

V Nginx patria hlavičky do bloku `server` príslušného webu. Dodatok `always` zaisťuje, že sa posielajú aj pri chybových stránkach.

```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;
}
```

Zvláštnosť Nginx: ak blok `location` nastaví vlastné príkazy `add_header`, hlavičky z bloku `server` sa tam neprevezmú. Skontrolujte preto aj podstránky a statické súbory. Ďalšie spevnenie pre túto kombináciu popisuje stránka [Zabezpečiť Nginx s PHP-FPM](https://phpsos.de/sk/server/nginx-php-fpm/).

## Nastaviť Security Header v Apache

V Apache potrebujete modul `mod_headers`. Príkazy patria do VirtualHost alebo, ak k nemu nemáte prístup, do `.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` a `ServerSignature` patria do hlavnej konfigurácie. Bránia tomu, aby server v odpovediach a na chybových stránkach uvádzal svoju presnú verziu. V `php.ini` dosiahnete to isté pre PHP pomocou `expose_php = Off`.

## Postupne zaviesť Content-Security-Policy

Content-Security-Policy je najúčinnejšia, ale aj najnáročnejšia hlavička. Určuje, z ktorých zdrojov sa smú načítavať skripty, štýly, obrázky, písma a rámy. Ak sa zavlečený skript doťahuje z cudzej domény, prehliadač ho zablokuje.

Moderné weby často zapájajú analytické nástroje, poskytovateľov platieb, mapové služby alebo videá. Príliš prísna politika potom ochromí funkcie. Postupujte preto po stupňoch:

- Najprv začať s `Content-Security-Policy-Report-Only`. Prehliadač hlási porušenia v konzole pre vývojárov alebo na zbernú adresu, ale nič neblokuje.
- Zaznamenať všetky potrebné zdroje a cielene ich povoliť, namiesto používania plošných zástupných znakov.
- Vložené skripty postupne presunúť do súborov alebo ich opatriť nonce, aby sa dalo upustiť od `'unsafe-inline'`.
- Až po testovacej fáze bez neočakávaných hlásení prepnúť na `Content-Security-Policy`.

> **Tip:**
> CSP dopĺňa čisté escapovanie v kóde, ale ho nenahrádza. Ako správne zabezpečiť výstupy v PHP, je v príručke [Zabrániť Cross-Site-Scripting v PHP](https://phpsos.de/sk/ratgeber/xss-php/).

## Hlavičky skontrolovať a vyhnúť sa typickým chybám

Po každej zmene by ste mali skontrolovať, či hlavičky skutočne prichádzajú. Ide to bez ďalších nástrojov pomocou `curl`:

```bash
# Otestovať konfiguráciu a znova načítať
nginx -t && systemctl reload nginx

# Zobraziť hlavičky domovskej stránky a statického súboru
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'
```

Typickými chybami sú dvojito nastavené hlavičky, ak webový server a aplikácia posielajú tie isté hlavičky, predradené CDN, ktoré hlavičky odstraňuje alebo prepisuje, a hlavičky, ktoré sa objavia iba na domovskej stránke, ale nie pri presmerovaniach alebo chybových stránkach. Skontrolujte navyše po aktualizáciách CMS alebo bezpečnostných rozšírení, či sa hlavičky nezmenili.

Určite preto jedno miesto, kde sa hlavičky spravujú, najlepšie webový server alebo predradená služba. Mnohé rozšírenia CMS ponúkajú tiež nastavenia pre bezpečnostné hlavičky. Je to pohodlné, ale ľahko to vedie k dvojitým alebo protichodným údajom, ak hlavičky nastavuje navyše server. Pre jednotlivé testy sa hodia aj vývojárske nástroje prehliadača: na karte Sieť vidíte pri každej požiadavke hlavičky odpovede a konzola zobrazuje porušenia Content-Security-Policy.

## Ako konkrétne pomáha PHP SOS?

- Kontrolujeme aktuálne hlavičky všetkých vašich webov, aj za CDN a proxy, a ukazujeme medzery a rozpory.
- Hlavičky nastavujeme centrálne vo webovom serveri v rámci [spevnenia servera](https://phpsos.de/sk/leistungen/server-haertung/) a testujeme domovskú stránku, podstránky a chybové stránky.
- Content-Security-Policy zavádzame v režime Report-Only, hlásenia vyhodnocujeme a po dohode ju prepíname na ostrý režim.
- Kde zmeny kódu nie sú okamžite možné, ochranu dopĺňame [pravidlami WAF a virtuálnym záplatovaním](https://phpsos.de/sk/leistungen/waf-virtuelles-patching/).


## Časté otázky

**Čo sú Security Header?**  
Security Header sú dodatočné údaje v odpovedi webového servera. Hovoria prehliadaču napríklad, že má stránku načítať iba cez HTTPS, nevykonávať cudzie skripty alebo stránku nezobrazovať v cudzích rámoch. Chránia predovšetkým návštevníkov.

**Chránia Security Header pred PHP2Shell?**  
Nie. PHP2Shell je zraniteľnosť v PHP na serveri, hlavičky pôsobia v prehliadači návštevníka. Proti PHP2Shell pomáha aktualizácia na opravenú verziu PHP a reštart všetkých workerov. Hlavičky sú doplnkové spevnenie pre iné druhy útokov.

**Môže Content-Security-Policy pokaziť môj web?**  
Áno, príliš prísna politika zablokuje potrebné skripty, písma alebo vložený obsah. Preto sa najprv zavádza v režime Report-Only, hlásenia sa vyhodnotia a až potom sa prepne na vynucovanie.

**Je X-XSS-Protection ešte zmysluplná?**  
Nie. Aktuálne prehliadače túto hlavičku už nevyhodnocujú a odporúča sa ju vynechať alebo nastaviť na 0. Ochranu pred Cross-Site-Scriptingom poskytuje čisté escapovanie v kóde a Content-Security-Policy.

## Zdroje

- [OWASP Cheat Sheet Series (HTTP Headers)](https://cheatsheetseries.owasp.org/)
- [OWASP Top 10](https://owasp.org/www-project-top-ten/)
- [BSI: odporúčania pre webové servery](https://www.bsi.bund.de/)
