# Turvapäised veebisaitidele: turvapäised õigesti seada

> Turvapäiste seadistus veebisaitidele: CSP, HSTS, X-Content-Type-Options ja muu Nginxi ning Apache'i näidetega, lisaks kontroll ja tüüpilised vead.

Allikas: https://phpsos.de/et/ratgeber/sicherheits-header/  
Seis: 25.10.2026  
Pakkuja: PHP SOS, PHP hädaabi ja serveri turvalisus. Kohene abi WhatsAppis: https://wa.me/491736494914?text=Tere%2C%20PHP%20SOS%2C%20vajame%20abi%20oma%20PHP-serveriga.%20Ettev%C3%B5te%3A%20%E2%80%A6%20Veebisait%3A%20%E2%80%A6

**Lühidalt:** Turvapäised on veebiserveri juhised brauserile, mis kaitsevad külastajaid rünnakute eest nagu Cross-Site-Scripting, Clickjacking ja krüpteerimata ühendused. Olulisimad on HSTS, Content-Security-Policy, X-Content-Type-Options, kaitse võõraste raamide vastu, Referrer-Policy ja Permissions-Policy. Need on mõistlik karastamine, kuid ei asenda uuendusi serveris.

## Mida turvapäised annavad ja mida mitte

Iga lehepäringu korral saadab veebiserver sisu kõrval kaasa ka päised. Mõned neist juhivad brauseri turvafunktsioone. Nii saab näiteks määrata, et leht laaditakse ainult HTTPS-i kaudu või et brauser ei käivita skripte võõrastelt domeenidelt.

Haldajate jaoks on piiritlus oluline: päised kaitsevad eelkõige külastajaid, näiteks sessioonide kinnihaaramise või manipuleeritud vormide eest. Need ei sulge servri turvauke. Nõrkus PHP-s, sisuhaldussüsteemis või laienduses jääb alles, olenemata sellest, kui hästi päised on seatud. Koos puhta koodiga piiravad need aga paljude vigade tagajärgi oluliselt.

## Olulisimad turvapäised ülevaates

| Päis | Eesmärk | Soovitus lähtepunktiks |
|---|---|---|
| Strict-Transport-Security (HSTS) | nõuab HTTPS-i tulevaste päringute jaoks | `max-age=31536000; includeSubDomains` |
| Content-Security-Policy (CSP) | määrab lubatud allikad skriptidele, piltidele, raamidele | individuaalne, esmalt Report-Only |
| X-Content-Type-Options | takistab brauseril failitüüpe arvamast | `nosniff` |
| X-Frame-Options või CSP frame-ancestors | takistab manustamist võõrastele lehtedele (Clickjacking) | `SAMEORIGIN` või `frame-ancestors 'self'` |
| Referrer-Policy | piirab, milline aadress edastatakse teistele lehtedele | `strict-origin-when-cross-origin` |
| Permissions-Policy | lülitab välja brauserifunktsioonid nagu kaamera või asukoht | lubada ainult vajalikud funktsioonid |

HSTS-i peaksite seadma alles siis, kui kõik alamdomeenid on usaldusväärselt HTTPS-i kaudu kättesaadavad. Brauser jätab juhise märgitud ajaks meelde; viga ei saa siis kohe tagasi võtta. Alustage vajaduse korral lühikese kehtivusajaga ja pikendage seda pärast edukaid teste. Lisavalik `preload` kannab domeeni püsivalt brauseritootjate nimekirjadesse ja seda tuleks seada ainult pärast hoolikat kontrolli.

Päised ei ole ka ainus koht, kus brauser kaitset pakub. Küpsistel peaksid olema atribuudid `Secure`, `HttpOnly` ja `SameSite`, et sessioone ei saaks krüpteerimata ühenduste ega skriptide kaudu kätte saada. Kuidas seda PHP-s seada, kirjeldab sessioonide juhend.

## Turvapäised Nginxis seada

Nginxis kuuluvad päised vastava veebisaidi `server`-plokki. Lisand `always` tagab, et need saadetakse ka vealehtede korral.

```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;
}
```

Nginxi eripära: kui `location`-plokk seab oma `add_header` käsud, ei võeta `server`-plokis olevaid päiseid seal üle. Kontrollige seetõttu ka alamlehti ja staatilisi faile. Selle kombinatsiooni edasist karastamist kirjeldab [Nginxi ja PHP-FPM-i turvamine](https://phpsos.de/et/server/nginx-php-fpm/).

## Turvapäised Apache'is seada

Apache'is vajate moodulit `mod_headers`. Käsud kuuluvad VirtualHost'i või, kui sellele juurdepääsu ei ole, faili `.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` ja `ServerSignature` kuuluvad põhiseadistusse. Need takistavad, et server nimetaks vastustes ja vealehtedel oma täpset versiooni. Failis `php.ini` saavutate sama PHP jaoks käsuga `expose_php = Off`.

## Content-Security-Policy järk-järgult kasutusele võtta

Content-Security-Policy on kõige tõhusam, kuid ka kõige nõudlikum päis. See määrab, millistest allikatest tohib skripte, laadilehti, pilte, fonte ja raame laadida. Kui sissetoodud skript laaditakse võõralt domeenilt, blokeerib brauser selle.

Kaasaegsed veebisaidid integreerivad sageli analüüsitööriistu, maksepakkujaid, kaarditeenuseid või videoid. Liiga range poliitika pidurdab siis funktsioone. Toimige seetõttu etappidena:

- Alustage esmalt päisega `Content-Security-Policy-Report-Only`. Brauser teatab rikkumistest arendajakonsoolis või kogumisaadressile, kuid ei blokeeri midagi.
- Koguge kokku kõik vajalikud allikad ja lubage need sihipäraselt, selle asemel et kasutada üldisi metamärke.
- Viige sisseehitatud skriptid järk-järgult faili(desse) või varustage need nonce'idega, et saaks `'unsafe-inline'`-ist loobuda.
- Lülituge alles pärast testperioodi ilma ootamatute teadeteta üle päisele `Content-Security-Policy`.

> **Näpunäide:**
> CSP täiendab puhast põgenemist (escaping) koodis, kuid ei asenda seda. Kuidas väljundeid PHP-s õigesti turvata, on kirjas juhendis [Cross-Site-Scriptingu vältimine PHP-s](https://phpsos.de/et/ratgeber/xss-php/).

## Päiste kontroll ja tüüpiliste vigade vältimine

Pärast iga muudatust peaksite kontrollima, kas päised tegelikult kohale jõuavad. See käib ilma lisatööriistadeta käsuga `curl`:

```bash
# Seadistust testida ja uuesti laadida
nginx -t && systemctl reload nginx

# Avalehe ja staatilise faili päiste kuvamine
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'
```

Tüüpilised vead on topelt seatud päised, kui veebiserver ja rakendus saadavad samu päiseid, eelnev CDN, mis päiseid eemaldab või üle kirjutab, ning päised, mis ilmuvad ainult avalehel, kuid mitte ümbersuunamistel või vealehtedel. Kontrollige lisaks pärast sisuhaldussüsteemi või turvalaienduste uuendusi, kas päised on muutunud.

Määrake seetõttu üks koht, kus päiseid hooldatakse, parim on veebiserver või eelnev teenus. Paljud sisuhaldussüsteemi laiendused pakuvad samuti turvapäiste seadeid. See on mugav, kuid viib kergesti topelt- või vastuoluliste andmeteni, kui lisaks seab päiseid ka server. Üksikuteks testideks sobivad ka brauseri arendajatööriistad: võrgu-vahekaardil näete iga päringu vastuse päiseid ja konsool näitab Content-Security-Policy rikkumisi.

## Kuidas PHP SOS konkreetselt aitab?

- Kontrollime kõigi teie veebisaitide praeguseid päiseid, ka CDN-i ja proksi taga, ning näitame lünki ja vastuolusid.
- Seame päised tsentraalselt veebiserveris [serveri karastamise](https://phpsos.de/et/leistungen/server-haertung/) raames ning testime avalehte, alamlehti ja vealehti.
- Võtame Content-Security-Policy kasutusele Report-Only-režiimis, analüüsime teateid ja lülitame selle pärast kooskõlastust jõustuma.
- Kus koodimuudatused ei ole kohe võimalikud, täiendame kaitset [WAF-reeglite ja virtuaalse paikamisega](https://phpsos.de/et/leistungen/waf-virtuelles-patching/).


## Korduma kippuvad küsimused

**Mis on turvapäised (Security Header)?**  
Turvapäised on veebiserveri vastuses olevad lisaandmed. Need ütlevad brauserile näiteks, et ta peab lehe laadima ainult HTTPS-i kaudu, mitte käivitama võõraid skripte või mitte kuvama lehte võõrastes raamides. Need kaitsevad eelkõige külastajaid.

**Kas turvapäised kaitsevad PHP2Shelli eest?**  
Ei. PHP2Shell on turvaauk PHP-s serveris, päised toimivad külastaja brauseris. PHP2Shelli vastu aitab uuendus parandatud PHP versioonile ja kõigi töötajate taaskäivitamine. Päised on täiendav karastamine muude rünnakuliikide vastu.

**Kas Content-Security-Policy võib mu veebisaidi rikkuda?**  
Jah, liiga range poliitika blokeerib vajalikke skripte, fonte või manustatud sisu. Seetõttu võetakse see esmalt kasutusele Report-Only-režiimis, hinnatakse teateid ja lülitatakse alles seejärel jõustamisele.

**Kas X-XSS-Protection on veel mõistlik?**  
Ei. Praegused brauserid seda päist enam ei hinda ja soovitus on see ära jätta või seada väärtusele 0. Kaitset Cross-Site-Scriptingu vastu pakuvad puhas põgenemine (escaping) koodis ja Content-Security-Policy.

## Allikad

- [OWASP Cheat Sheet Series (HTTP Headers)](https://cheatsheetseries.owasp.org/)
- [OWASP Top 10](https://owasp.org/www-project-top-ten/)
- [BSI: soovitused veebiserveritele](https://www.bsi.bund.de/)
