# HSTS

> A teszt azt nézi, hogy az oldal Strict-Transport-Security fejléce legalább hat hónapra kötelezi-e a böngészőt a https használatára; ha nem, add hozzá a fejlécet.

A HSTS (HTTP Strict Transport Security) egy válaszfejléc, amellyel az oldal azt kéri a böngészőtől, hogy a megadott ideig **csak https-en** érje el. Ha a látogató a `http://` címet írja be, a böngésző még a kérés elküldése előtt átírja `https://`-re. Ez megvéd a kapcsolat lehallgatásától és a https-ről http-re terelő támadásoktól.

A HSTS az átirányítás kiegészítése, nem helyettesítője: az első látogatást nem védi, mert a böngészőnek előbb egyszer https-en meg kell kapnia a fejlécet (MDN). Az első kérés védelméhez az [HTTPS-átirányítás](https://hub.hellowp.io/hu/report/biztonsag/https-atiranyitas/) kell. A riportban a teszt súlyossága közepes.

## Hogyan mérjük

A riport a vizsgált oldal főoldalának válaszfejlécét nézi (a kérés követi az átirányításokat, és a végső válasz fejléce számít). A `Strict-Transport-Security` fejlécből kiolvassa a `max-age` értékét.

- **Megfelelő:** van `max-age=<szám>`, és a szám legalább **15 768 000** másodperc (182,5 nap, vagyis hat hónap).
- **Hiba:** nincs a fejléc, nincs benne `max-age`, vagy az érték kisebb 15 768 000-nél (a `max-age=0` is ide tartozik, az kikapcsolja a HSTS-t). Az érték idézőjelben is elfogadott.

A teszt kétállapotú, figyelmeztetés nincs. A küszöb a Mozilla ajánlott minimuma: legalább hat hónap (15 768 000), de a Mozilla két évet (63 072 000) javasol.

Amit a teszt **nem** néz:

- az `includeSubDomains` és a `preload` direktívát,
- hogy a fejléc https-válaszban érkezett-e. Az RFC 6797 szerint a böngésző a http-n kapott HSTS-fejlécet figyelmen kívül hagyja, a riport viszont a fejléc jelenlétét akkor is megfelelőnek veszi, ha az oldal csak http-n érhető el,
- az aloldalakat és az aldomaineket, csak a főoldalt.

## Hogyan javítsd

A HSTS bekapcsolása előtt győződj meg róla, hogy az oldal és (ha használod az `includeSubDomains` direktívát) az összes aldomain **tényleg működik https-en**. A Mozilla útmutatója szerint a beállítás után a webhelynek a lejáratig https-en kell maradnia: a böngésző a `max-age` idejéig nem engedi a http-t. A kikapcsolás is csak https-en küldött `max-age=0`-val lehetséges, ezért nincs gyors visszalépés.

A riport kártyája `max-age=31536000` értéket (egy év) javasol. Az alábbi kódok mindegyike a fejlécet **egyedül** állítja be; ha a riport több hiányzó fejlécet jelez, ugyanabba a blokkba kerülhet mindegyik (lásd: [X-Content-Type-Options](https://hub.hellowp.io/hu/report/biztonsag/x-content-type-options/), [Referrer-Policy](https://hub.hellowp.io/hu/report/biztonsag/referrer-policy/), [Cross-Origin-Opener-Policy](https://hub.hellowp.io/hu/report/biztonsag/cross-origin-opener-policy/)).

### nginx

Az nginx `server` blokkjába. Az `always` paraméter miatt a fejléc hibakódú válaszokon is megjelenik. Ha egy `location` blokkban is van `add_header`, oda is be kell írni, mert az nginx dokumentációja szerint a fejlécek csak akkor öröklődnek az előző szintről, ha az adott szinten nincs `add_header`.

```nginx title="nginx"
add_header Strict-Transport-Security "max-age=31536000" always;
```

### Apache (.htaccess)

A webroot `.htaccess` fájljába. A `mod_headers` modul kell hozzá; az `<IfModule>` miatt a hiányzó modul nem okoz 500-as hibát.

```apache title=".htaccess"
<IfModule mod_headers.c>
    Header always set Strict-Transport-Security "max-age=31536000"
</IfModule>
```

### Cloudflare

Két út van.

A Cloudflare saját HSTS-beállítása: **SSL/TLS → Edge Certificates → HTTP Strict Transport Security (HSTS) → Enable HSTS**. A beállításban a `max-age` 1 és 12 hónap között választható, külön kapcsolható az `includeSubDomains` és a `preload`. Ellenőrizd a kész fejlécet (lásd lent), hogy a választott időtartam eléri-e a riport 15 768 000 másodperces küszöbét. A 12 hónap biztosan eléri.

Vagy válaszfejléc-átalakító szabállyal: **Rules → Overview → Create rule → Response Header Transform Rule**.

```text title="Cloudflare"
Set static: Strict-Transport-Security = max-age=31536000
```

### WordPress

Új fájlba: `wp-content/mu-plugins/biztonsagi-fejlecek.php` (Bedrockon: `web/app/mu-plugins/biztonsagi-fejlecek.php`). A `send_headers` akció azután fut le, hogy a WordPress elküldte a saját fejléceit.

```php title="biztonsagi-fejlecek.php"
<?php
add_action( 'send_headers', function () {
    header( 'Strict-Transport-Security: max-age=31536000' );
} );
```

### Hosszabb időtartam, aldomainek, preload

Ha az oldal stabilan működik https-en, a Mozilla két évet javasol (`max-age=63072000`). Az `includeSubDomains` az összes aldomainre kiterjeszti a szabályt, ezért azokat is https-re kell hozni előbb. A `preload` a MDN szerint legalább `max-age=31536000` értéket és `includeSubDomains` direktívát kér, és belekerülés után a böngészők beépített listáján is szerepelni fogsz: ez gyakorlatilag visszavonhatatlan döntés, ezért csak tudatosan kapcsold be.

## Hogyan ellenőrizd

Futtasd újra a riportot. Parancssorból a fejlécet így nézheted meg:

```bash title="Terminál"
curl -sI https://example.com/ | grep -i strict-transport-security
```

A kimenetben a `max-age` értékének legalább 15768000-nek kell lennie. Az [SSL Labs SSL Server Test](https://hub.hellowp.io/hu/knowledge-base/useful-tools/ssl-labs/) is jelzi a HSTS állapotát.
