Aktuální situace: PHP2Shell. Dvě kritické zranitelnosti PHP (CVSS 9.2) umožňují spustit škodlivý kód bez přihlášení. Záplaty od 21. 10. 2026.Co nyní udělat →

Bezpečnostní hlavičky pro weby: jak je správně nastavit

Bezpečnostní hlavičky přikazují prohlížeči lépe chránit vaše návštěvníky. Jak nastavit nejdůležitější hlavičky v Nginx a Apache, zavést Content Security Policy postupně a zkontrolovat výsledek.

Stav 5 min čteníPoradna

Stručně: Bezpečnostní hlavičky jsou pokyny webového serveru prohlížeči, které chrání návštěvníky před útoky jako cross-site scripting, clickjacking a nešifrovaná spojení. Nejdůležitější jsou HSTS, Content Security Policy, X-Content-Type-Options, ochrana proti cizím rámcům, Referrer-Policy a Permissions-Policy. Jsou rozumným zabezpečením, ale nenahrazují aktualizace na serveru.

Co bezpečnostní hlavičky dokážou a co ne

U každého zobrazení stránky posílá webový server vedle obsahu také hlavičky. Některé z nich řídí bezpečnostní funkce prohlížeče. Lze tak například určit, že se stránka načte jen přes HTTPS nebo že prohlížeč nespouští skripty z cizích domén.

Pro provozovatele je důležité správné zařazení: hlavičky chrání především návštěvníky, například před zachycením relací nebo zmanipulovanými formuláři. Mezery na serveru neuzavírají. Zranitelnost v PHP, v CMS nebo v rozšíření zůstává, bez ohledu na to, jak dobře jsou hlavičky nastaveny. Ve spojení s čistým kódem ale výrazně omezují následky mnoha chyb.

Nejdůležitější bezpečnostní hlavičky v přehledu

Hlavička Účel Doporučení jako výchozí bod
Strict-Transport-Security (HSTS) vynucuje HTTPS pro budoucí přístupy max-age=31536000; includeSubDomains
Content-Security-Policy (CSP) určuje povolené zdroje skriptů, obrázků, rámců individuálně, nejdřív jako Report-Only
X-Content-Type-Options brání prohlížeči hádat typy souborů nosniff
X-Frame-Options, resp. CSP frame-ancestors brání vložení do cizích stránek (clickjacking) SAMEORIGIN, resp. frame-ancestors 'self'
Referrer-Policy omezuje, jaká adresa se předává jiným stránkám strict-origin-when-cross-origin
Permissions-Policy vypíná funkce prohlížeče jako kamera nebo poloha povolit jen potřebné funkce

HSTS byste měli nastavit až tehdy, když jsou všechny subdomény spolehlivě dostupné přes HTTPS. Prohlížeč si pokyn pamatuje po uvedenou dobu; chybu pak nelze okamžitě vzít zpět. Případně začněte s krátkou dobou platnosti a po úspěšných testech ji zvyšte. Dodatečná volba preload zapíše doménu trvale do seznamů výrobců prohlížečů a měla by se nastavit jen po pečlivé kontrole.

Hlavičky také nejsou jediným místem, kde prohlížeč poskytuje ochranu. Cookies by měly nést atributy Secure, HttpOnly a SameSite, aby relace nebylo možné zachytit přes nešifrovaná spojení nebo skripty. Jak to v PHP nastavit, popisuje příručka k relacím.

Nastavení bezpečnostních hlaviček v Nginx

V Nginx patří hlavičky do bloku server příslušného webu. Dodatek always zajišťuje, že se pošlou i u chybových stránek.

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áštnost Nginx: pokud blok location nastavuje vlastní příkazy add_header, hlavičky z bloku server se tam nepřebírají. Zkontrolujte proto i podstránky a statické soubory. Další zabezpečení pro tuto kombinaci popisuje článek Zabezpečení Nginx s PHP-FPM.

Nastavení bezpečnostních hlaviček v Apache

U Apache potřebujete modul mod_headers. Příkazy patří do VirtualHost nebo, pokud k němu nemáte přístup, do .htaccess.

<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 patří do hlavní konfigurace. Brání tomu, aby server v odpovědích a chybových stránkách uváděl svou přesnou verzi. V php.ini dosáhnete totéž u PHP pomocí expose_php = Off.

Postupné zavedení Content Security Policy

Content Security Policy je nejúčinnější, ale také nejnáročnější hlavička. Určuje, z jakých zdrojů se smějí načítat skripty, styly, obrázky, písma a rámce. Pokud se podstrčený skript načítá z cizí domény, prohlížeč jej zablokuje.

Moderní weby často vkládají analytické nástroje, poskytovatele plateb, mapové služby nebo videa. Příliš přísná politika pak vyřadí funkce z provozu. Postupujte proto po stupních:

  • Nejdřív začít s Content-Security-Policy-Report-Only. Prohlížeč hlásí porušení ve vývojářské konzoli nebo na sběrnou adresu, ale nic neblokuje.
  • Zjistit všechny potřebné zdroje a cíleně je povolit, místo používání plošných zástupných znaků.
  • Vložené skripty postupně přesunout do souborů nebo opatřit nonce, aby se dalo vzdát 'unsafe-inline'.
  • Až po zkušební fázi bez neočekávaných hlášení přepnout na Content-Security-Policy.
Tip

CSP doplňuje čisté escapování v kódu, ale nenahrazuje ho. Jak správně zabezpečit výstupy v PHP, popisuje příručka Jak zabránit cross-site scriptingu v PHP.

Kontrola hlaviček a předcházení typickým chybám

Po každé změně byste měli ověřit, zda hlavičky skutečně dorazí. Bez dalších nástrojů to jde pomocí curl:

# Otestovat konfiguraci a znovu načíst
nginx -t && systemctl reload nginx

# Zobrazit hlavičky úvodní stránky a statického souboru
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é chyby jsou dvakrát nastavené hlavičky, když webový server a aplikace posílají tytéž hlavičky, předřazené CDN, které hlavičky odstraňuje nebo přepisuje, a hlavičky, které se objevují jen na úvodní stránce, ale ne u přesměrování nebo chybových stránek. Po aktualizacích CMS nebo bezpečnostních rozšíření také zkontrolujte, zda se hlavičky nezměnily.

Určete proto jedno místo, kde se hlavičky udržují, nejlépe webový server nebo předřazenou službu. Mnoho rozšíření CMS nabízí nastavení bezpečnostních hlaviček také. To je pohodlné, ale snadno vede ke zdvojeným nebo protichůdným údajům, pokud hlavičky nastavuje i server. Pro jednotlivé testy se hodí také vývojářské nástroje prohlížeče: na záložce Síť vidíte u každého požadavku hlavičky odpovědi a konzole zobrazuje porušení Content Security Policy.

Jak konkrétně pomáhá PHP SOS?

  • Zkontrolujeme aktuální hlavičky všech vašich webů, i za CDN a proxy, a ukážeme mezery a rozpory.
  • Hlavičky nastavíme centrálně ve webovém serveru v rámci zabezpečení serveru a otestujeme úvodní stránku, podstránky i chybové stránky.
  • Content Security Policy zavádíme v režimu Report-Only, hlášení vyhodnotíme a po dohodě ji přepneme do ostrého režimu.
  • Tam, kde změny kódu nejsou okamžitě možné, ochranu doplníme pravidly WAF a virtuálním záplatováním.

Časté dotazy

Co jsou bezpečnostní hlavičky?

Bezpečnostní hlavičky jsou doplňující údaje v odpovědi webového serveru. Prohlížeči například říkají, že má stránku načítat jen přes HTTPS, nespouštět cizí skripty nebo stránku nezobrazovat v cizích rámcích. Chrání především návštěvníky.

Chrání bezpečnostní hlavičky před PHP2Shell?

Ne. PHP2Shell je zranitelnost v PHP na serveru, hlavičky působí v prohlížeči návštěvníka. Proti PHP2Shell pomáhá aktualizace na opravenou verzi PHP a restart všech workerů. Hlavičky jsou doplňkové zabezpečení proti jiným druhům útoků.

Může Content Security Policy mému webu uškodit?

Ano, příliš přísná politika zablokuje potřebné skripty, písma nebo vložený obsah. Proto se nejdříve zavádí v režimu Report-Only, vyhodnotí se hlášení a teprve poté se přepne na vynucování.

Má X-XSS-Protection ještě smysl?

Ne. Aktuální prohlížeče tuto hlavičku už nevyhodnocují a doporučení zní ji vynechat nebo nastavit na 0. Ochranu před cross-site scriptingem poskytují čisté escapování v kódu a Content Security Policy.

Zdroje

Okamžitý kontakt

Každá hodina se počítá. Napište nám hned.

Stručně popište systém, verzi PHP a pozorování. Ozveme se, vyjasníme situaci a budeme pracovat na dálku, dokud nebude incident uzavřen a zdokumentován.

Okamžitá pomoc