# Security header svetainėms: kaip teisingai nustatyti saugumo antraštes

> Security header svetainėms: CSP, HSTS, X-Content-Type-Options ir kita su pavyzdžiais Nginx bei Apache, taip pat patikra ir tipinės klaidos.

Šaltinis: https://phpsos.de/lt/ratgeber/sicherheits-header/  
Būsena: 2026-10-25  
Teikėjas: PHP SOS, PHP avarinė pagalba ir serverio sauga. Skubi pagalba per „WhatsApp“: https://wa.me/491736494914?text=Sveiki%2C%20PHP%20SOS%2C%20mums%20reikia%20pagalbos%20su%20m%C5%ABs%C5%B3%20PHP%20serveriu.%20%C4%AEmon%C4%97%3A%20%E2%80%A6%20Svetain%C4%97%3A%20%E2%80%A6

**Trumpai:** Security header yra žiniatinklio serverio nurodymai naršyklei, saugantys lankytojus nuo atakų, tokių kaip Cross-Site Scripting, clickjacking ir nešifruoti ryšiai. Svarbiausios yra HSTS, Content-Security-Policy, X-Content-Type-Options, apsauga nuo svetimų rėmų, Referrer-Policy ir Permissions-Policy. Tai prasmingas sutvirtinimas, bet jis nepakeičia atnaujinimų serveryje.

## Ką security header duoda ir ko neduoda

Su kiekvienu puslapio iškvietimu žiniatinklio serveris kartu su turiniu siunčia ir antraštes. Kai kurios iš jų valdo naršyklės saugumo funkcijas. Taip, pavyzdžiui, galima nustatyti, kad puslapis būtų įkeliamas tik per HTTPS arba kad naršyklė nevykdytų skriptų iš svetimų domenų.

Operatoriams svarbus vertinimas: antraštės visų pirma saugo lankytojus, pavyzdžiui, nuo sesijų pagrobimo ar suklastotų formų. Jos neuždaro pažeidžiamumų serveryje. PHP, CMS ar plėtinio spraga lieka, nesvarbu, kaip gerai nustatytos antraštės. Kartu su tvarkingu kodu jos vis dėlto gerokai apriboja daugelio klaidų pasekmes.

## Svarbiausios security header apžvalga

| Antraštė | Paskirtis | Rekomendacija kaip pradžios taškas |
|---|---|---|
| Strict-Transport-Security (HSTS) | priverčia naudoti HTTPS būsimiems iškvietimams | `max-age=31536000; includeSubDomains` |
| Content-Security-Policy (CSP) | nustato leistinus skriptų, paveikslėlių, rėmų šaltinius | individualiai, pirmiausia kaip Report-Only |
| X-Content-Type-Options | neleidžia naršyklei spėlioti failų tipų | `nosniff` |
| X-Frame-Options arba CSP frame-ancestors | neleidžia įterpti į svetimus puslapius (clickjacking) | `SAMEORIGIN` arba `frame-ancestors 'self'` |
| Referrer-Policy | riboja, koks adresas perduodamas kitiems puslapiams | `strict-origin-when-cross-origin` |
| Permissions-Policy | išjungia naršyklės funkcijas, tokias kaip kamera ar vietos nustatymas | leisti tik reikalingas funkcijas |

HSTS nustatykite tik tada, kai visi subdomenai patikimai pasiekiami per HTTPS. Naršyklė nurodymą įsimena nurodytam laikui; klaidos tuomet iš karto atšaukti nepavyks. Prireikus pradėkite nuo trumpos trukmės ir po sėkmingų testų ją didinkite. Papildoma parinktis `preload` domeną visam laikui įrašo į naršyklių gamintojų sąrašus ir turėtų būti nustatoma tik kruopščiai patikrinus.

Antraštės taip pat nėra vienintelė vieta, kur naršyklė suteikia apsaugą. Slapukai turėtų turėti atributus `Secure`, `HttpOnly` ir `SameSite`, kad sesijų nebūtų galima pagrobti per nešifruotus ryšius ar skriptus. Kaip tai nustatyti PHP, aprašo sesijų vadovas.

## Security header nustatymas Nginx

Nginx antraštės priklauso atitinkamos svetainės `server` blokui. Priedas `always` užtikrina, kad jos būtų siunčiamos ir klaidų puslapiuose.

```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;
}
```

Nginx ypatumas: jei `location` blokas nustato savo `add_header` nurodymus, `server` bloko antraštės ten neperimamos. Todėl patikrinkite ir poputslapius bei statinius failus. Tolesnį šio derinio sutvirtinimą aprašo [Nginx su PHP-FPM apsauga](https://phpsos.de/lt/server/nginx-php-fpm/).

## Security header nustatymas Apache

Apache serveryje reikia modulio `mod_headers`. Nurodymai priklauso VirtualHost arba, jei prie jo prieigos nėra, `.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` ir `ServerSignature` priklauso pagrindinei konfigūracijai. Jie neleidžia serveriui atsakymuose ir klaidų puslapiuose nurodyti tikslios versijos. PHP to paties pasieksite `php.ini` su `expose_php = Off`.

## Content-Security-Policy palaipsnis įvedimas

Content-Security-Policy yra veiksmingiausia, bet ir sudėtingiausia antraštė. Ji nustato, iš kokių šaltinių leidžiama įkelti skriptus, stiliaus lenteles, paveikslėlius, šriftus ir rėmus. Jei įterptas skriptas bandomas įkelti iš svetimo domeno, naršyklė jį blokuoja.

Šiuolaikinės svetainės dažnai įtraukia analizės įrankius, mokėjimų teikėjus, žemėlapių paslaugas ar vaizdo įrašus. Per griežta politika tuomet sustabdo funkcijas. Todėl veikite etapais:

- Pirmiausia pradėkite su `Content-Security-Policy-Report-Only`. Naršyklė praneša apie pažeidimus kūrėjo konsolėje arba surinkimo adresu, bet nieko neblokuoja.
- Užfiksuokite visus reikalingus šaltinius ir leiskite juos tikslingai, užuot naudoję bendrus pakaitos simbolius.
- Įterptinius skriptus palaipsniui perkelkite į failus arba pažymėkite nonce, kad būtų galima atsisakyti `'unsafe-inline'`.
- Tik po bandomojo laikotarpio be netikėtų pranešimų perjunkite į `Content-Security-Policy`.

> **Patarimas:**
> CSP papildo tvarkingą escaping kode, bet jo nepakeičia. Kaip PHP saugiai tvarkyti išvestį, aprašo vadovas [Kaip užkirsti kelią Cross-Site Scripting PHP](https://phpsos.de/lt/ratgeber/xss-php/).

## Antraščių patikra ir tipinių klaidų vengimas

Po kiekvieno pakeitimo patikrinkite, ar antraštės tikrai pasiekia. Tai galima padaryti be papildomų įrankių su `curl`:

```bash
# Išbandyti konfigūraciją ir perkrauti
nginx -t && systemctl reload nginx

# Parodyti pradžios puslapio ir statinio failo antraštes
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'
```

Tipinės klaidos yra dukart nustatytos antraštės, kai žiniatinklio serveris ir programa siunčia tas pačias antraštes, prieš tai esantis CDN, kuris antraštes pašalina ar perrašo, ir antraštės, kurios rodomos tik pradžios puslapyje, bet ne peradresavimuose ar klaidų puslapiuose. Be to, po CMS ar saugumo plėtinių atnaujinimų patikrinkite, ar antraštės nepasikeitė.

Todėl nustatykite vieną vietą, kur antraštės prižiūrimos, geriausia žiniatinklio serverį arba prieš jį esančią paslaugą. Daugelis CMS plėtinių taip pat turi saugumo antraščių nustatymus. Tai patogu, bet lengvai lemia dvigubus ar prieštaringus duomenis, jei papildomai antraštes nustato serveris. Atskiriems testams tinka ir naršyklės kūrėjo įrankiai: tinklo skirtuke prie kiekvienos užklausos matote atsakymo antraštes, o konsolė rodo Content-Security-Policy pažeidimus.

## Kaip PHP SOS padeda konkrečiai?

- Tikriname visų jūsų svetainių dabartines antraštes, taip pat už CDN ir tarpinio serverio, ir parodome spragas bei prieštaravimus.
- Antraštes nustatome centralizuotai žiniatinklio serveryje pagal [serverio sutvirtinimą](https://phpsos.de/lt/leistungen/server-haertung/) ir išbandome pradžios puslapį, poputslapius ir klaidų puslapius.
- Content-Security-Policy įvedame Report-Only režimu, analizuojame pranešimus ir po suderinimo įjungiame vykdymą.
- Kur kodo pakeitimai nėra iš karto įmanomi, apsaugą papildome [WAF taisyklėmis ir virtualiu pataisymu](https://phpsos.de/lt/leistungen/waf-virtuelles-patching/).


## Dažni klausimai

**Kas yra security header?**  
Security header yra papildomi žiniatinklio serverio atsakymo duomenys. Jie, pavyzdžiui, nurodo naršyklei puslapį įkelti tik per HTTPS, nevykdyti svetimų skriptų ar nerodyti puslapio svetimuose rėmuose. Jie visų pirma saugo lankytojus.

**Ar security header saugo nuo PHP2Shell?**  
Ne. PHP2Shell yra pažeidžiamumas PHP serveryje, antraštės veikia lankytojo naršyklėje. Nuo PHP2Shell padeda atnaujinimas iki ištaisytos PHP versijos ir visų darbinių procesų paleidimas iš naujo. Antraštės yra papildomas sutvirtinimas kitoms atakų rūšims.

**Ar Content-Security-Policy gali sugadinti mano svetainę?**  
Taip, per griežta politika blokuoja reikalingus skriptus, šriftus ar įterptą turinį. Todėl ją pirmiausia įveskite Report-Only režimu, išanalizuokite pranešimus ir tik tada perjunkite į vykdymą.

**Ar X-XSS-Protection dar prasmingas?**  
Ne. Dabartinės naršyklės šios antraštės nebevertina, o rekomendacija yra jos atsisakyti arba nustatyti 0. Apsaugą nuo Cross-Site Scripting suteikia tvarkingas escaping kode ir Content-Security-Policy.

## Šaltiniai

- [OWASP Cheat Sheet Series (HTTP Headers)](https://cheatsheetseries.owasp.org/)
- [OWASP Top 10](https://owasp.org/www-project-top-ten/)
- [BSI: rekomendacijos žiniatinklio serveriams](https://www.bsi.bund.de/)
