Vissza a bloghoz

Security header-ek: HSTS, CSP, X-Frame-Options és mások

· 7 perc olvasás

A backend egy erőd, de a védelem másik fele a böngészőben van. A HSTS, CSP és más header-ek blokkolják az XSS-t, clickjacking-et és MITM-et - ingyen.

Security header-ek: HSTS, CSP, X-Frame-Options és mások

Miért fontosak

Egy alkalmazás lehet a backend oldalon tökéletesen biztonságos, és mégis sebezhető marad a böngésző oldali támadásokkal szemben: cross-site scripting (XSS), clickjacking, protocol downgrade, MIME confusion. A security headerek a védelmet magába a böngészőbe tolják.

Strict-Transport-Security (HSTS)

HTTPS-t kényszerít minden jövőbeli látogatáshoz. Az első HTTPS-látogatás után a böngésző megjegyzi a domaint, és magától átírja bármelyik http:// linket https://-re, akkor is, ha a felhasználó rossz linkre kattint.

Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
  • max-age=63072000 = 2 évig érvényes
  • includeSubDomains = a szabály minden aldomainre is vonatkozik; HTTPS-t kényszerít mindenhol, így ha van csak HTTP-n futó aldomained, pl. staging.example.com, az a böngészőben elérhetetlenné válik
  • preload = engedélyezi a felvételt a Chrome / Firefox / Safari beépített HSTS preload listájába

Figyelem: A preload-dal ellátott HSTS eltávolítása a listáról 6+ hónapig tart. Ne add hozzá a preload-ot, amíg nem ellenőrizted, hogy a HTTPS stabilan működik minden aldomainen.

Content-Security-Policy (CSP)

A legerősebb, de egyben a legnehezebben beállítható header. Whitelistezi, honnan tölthet le a böngésző scripteket, stílusokat, képeket és iframe-eket. CSP nélkül egy támadó, aki <script> taget tud injektálni, tetszőleges JS-t futtathat; CSP-vel csak jóváhagyott forrásból származó kódot.

Content-Security-Policy: default-src 'self'; script-src 'self' 'sha256-...'; img-src 'self' data: https://cdn.example.com; style-src 'self' 'unsafe-inline'; frame-ancestors 'none'

Gyakori direktívák:

  • default-src 'self' = alapértelmezetten csak a saját domainemről engedj erőforrásokat
  • script-src = JS források (inline scriptekhez adj meg hash-t vagy nonce-t)
  • style-src = CSS források
  • img-src = képek
  • connect-src = AJAX, WebSocket, EventSource
  • frame-ancestors 'none' = senki sem ágyazhatja be az oldalt iframe-be (jobb, mint az X-Frame-Options)
  • report-uri /csp-report = a böngésző minden megsértésnél JSON-t küld (te a backendben elkapod és logolod)
  • Megjegyzés: a report-uri ma már deprecated - a report-to-t támogató böngészők figyelmen kívül hagyják. A modern megoldás a report-to direktíva plusz egy külön Reporting-Endpoints fejléc; a report-uri-t hagyd meg csak fallbacknek a Firefoxhoz, amely a report-to-t még nem támogatja.

X-Frame-Options

A frame-ancestors régebbi alternatívája. Megakadályozza a clickjackinget, amikor a támadó beágyazza az oldaladat iframe-ként, és láthatatlan gombokkal takarja le.

X-Frame-Options: DENY

Értékek: DENY (senki), SAMEORIGIN (csak a saját domainem), ALLOW-FROM uri (deprecated).

X-Content-Type-Options

X-Content-Type-Options: nosniff

Kikapcsolja a MIME sniffinget, így a böngésző tiszteletben tartja a szerver által visszaadott Content-Type-ot. Enélkül a támadó feltölthet rossz típusú fájlt (pl. képet, ami valójában scriptet tartalmazó HTML), és a böngésző weboldalként futtathatja.

Referrer-Policy

Referrer-Policy: strict-origin-when-cross-origin

Szabályozza, mennyi információt küld a böngésző az előző oldalról a Referer headerben kattintáskor. A modern böngészőkben az alapértelmezett már strict-origin-when-cross-origin, de a header explicit beállítása konzisztens viselkedést garantál.

Permissions-Policy

Kikapcsolja a nem szükséges API-kat, mint a kamera, mikrofon, GPS és geolokáció. Egy XSS-t kihasználó támadó nem kérheti ezeket az API-kat.

Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=()

Gyakorlati nginx konfiguráció

server {
  listen 443 ssl http2;
  server_name example.com;

  add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;
  # a preload-ot itt szándékosan kihagytuk - csak akkor add hozzá, ha 100%-ig biztos vagy (lásd a preload csapdát fent)
  add_header X-Content-Type-Options "nosniff" always;
  add_header X-Frame-Options "DENY" always;
  add_header Referrer-Policy "strict-origin-when-cross-origin" always;
  add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;

  # A CSP terjedelmes - az alkalmazásod szerint definiáld
  add_header Content-Security-Policy "default-src 'self'; script-src 'self'; ..." always;
}

A kulcs az always - enélkül az nginx a hibaválaszoknál (4xx, 5xx) kihagyja a headereket.

A jelenlegi állapot auditja

A legegyszerűbb online eszközzel. A mi header checkünk megmutatja, mely headerek hiányoznak és melyek hibásak. Alapos audithoz a securityheaders.com is ad A-F pontszámot.

Következtetés

A security headerek a ráfordítás-haszon arányt tekintve a biztonság egyik legjobb befektetése: jellemzően fél óra beállítás a reverse proxyban a böngésző oldali támadások egész kategóriája ellen. A rendszeres karbantartás keretében félévente egy audit ésszerű minimum.

Ingyenes security headers audit

Regisztráció nélkül, eredmény három másodperc alatt.

Weboldal tesztelése →

Megosztás: Link másolva

Próbálja ki az ePulz.io-t ingyen - 7 nap bankkártya nélkül.

Fiók létrehozása