Otsakkeet (headers) on asetettava vähintään kaikille niille HTTP-vastauksille, joita kutsutaan web-selaimista.

Yleisesti on suositeltavaa asettaa nämä otsakkeet myös rajapinnoille (API), joita selaimien ei ole tarkoitus kutsua. Otsakkeet kannattaa asettaa erityisesti silloin, kun nämä rajapinnat ovat avoinna julkiseen verkkoon eli Internetiin.

Lisää tietoa rajapintoihin liittyvästä turvallisuudesta on luvussa 12.7 Ohjelmointirajapinnat (API) ja sen alaluvuissa.



Content Security Policy (CSP)

CSP-otsakkeella voidaan rajata, mistä lähteistä selain saa ladata sivulle esimerkiksi kuvia, skriptejä tai tyylitiedostoja. On suositeltavaa asettaa niin tiukka CSP-otsake kuin suinkin mahdollista, sallien ainoastaan nimetyt lähteet. CSP-otsakkeesta on määritelty tasot 1 ja 2. Kaikki modernit selaimet tukevat CSP tasoa 2.


Esimerkkejä CSP-otsakkeesta

Otsake sallii sisällön latauksen ainoastaan samasta lähteestä ja rajoittaa kehysten käyttöä:

Content-Security-Policy: default-src 'none'; script-src 'self'; connect-src 'self'; img-src 'self'; style-src 'self'; child-src 'self'; frame-ancestors 'none'

Otsake on sama kuin edellinen, mutta se raportoi lisäksi poikkeukset raportointirajapintaan. Tästä voi olla hyötyä konfiguraatio-ongelmien selvittämisessä:

Content-Security-Policy: default-src 'none'; script-src 'self'; connect-src 'self'; img-src 'self'; style-src 'self'; child-src 'self'; frame-ancestors 'none'; report-uri/some-report-uri

Otsake ainoastaan raportoi sääntöjä rikkovat pyynnöt, muttei rajoita niiden lataamista. Tätä vaihtoehtoa kannattaa käyttää vain palvelun kehitysvaiheessa, ei tuotannossa.

Content-Security-Policy-Report-Only: default-src 'none'; script-src 'self'; connect-src 'self'; img-src 'self'; style-src 'self'; child-src 'self'; frame-ancestors 'none'; report-uri/some-report-uri




HTTP Strict Transport Security (HSTS)

HTTP Strict Transport Security (HSTS) -otsake pakottaa selaimen käyttämään kaikissa tulevissa yhteyksissä sivustolle HTTPS-protokollaa. HSTS-otsake tulisi asettaa kaikille HTTPS-yhteyden kautta annettaville vastauksille, ja koska kaikki palvelut tulisi tarjota TLS:llä, HSTS tulisi asettaa kaikille vastauksille.

Säännölle annetaan yläraja sekunteina, jonka jälkeen voidaan taas muodostaa salaamattomia yhteyksiä. Sopiva arvo HSTS-otsakkeelle on 6 kuukautta eli 15 552 000 sekuntia. Palveluille, joita käytetään samalta selaimelta harvemmin (esimerkiksi kerran vuodessa), pidempi ajanjakso voi olla tarpeen. Sääntö voidaan myös ulottaa käsittämään kaikki aliosoitteet includeSubDomains -parametrilla.

HSTS-otsake saattaa estää palvelun käytön, jos palvelimen varmenne on unohdettu uusia tai jos kuormantasaus tai CDN-palvelu käyttää samaa osoitetta ilman toimivaa varmennetta.

HTTPS:n oletusarvoisen käytön varmistamiseksi sivusto voidaan myös ilmoittaa etukäteen selainvalmistajien ’preload’ -listalle (ks. Lähteet). Tällöin otsakkeeseen on lisättävä preload -direktiivi.

Esimerkki HSTS-otsakkeesta

Strict-Transport-Security: max-age=15552000




Cache-Control ja Expires

Cache-Control-otsakkeella ohjataan selaimen välimuistin ja mahdollisten välityspalvelimien toimintaa. Otsakkeella voidaan määrittää sisällölle vanhenemisaika, rajoittaa sisällön tallentamista välimuisteihin ja ohjeistaa välimuistia sisällön päivittämisestä.

Turvallisuusnäkökulmasta voi olla tarpeen estää luottamuksellisen tiedon tallennus välimuistiin. Seuraava otsake-esimerkki kieltää sisällön tallentamisen välimuistiin, kieltää kaiken HTTP-pyyntöön liittyvän tiedon tallentamisen ja pakottaa selaimen aina tekemään pyynnön uudestaan. Tätä otsaketta ei tulisi asettaa staattisten resurssien osalta suorituskykyvaikutusten vuoksi.

Esimerkki Cache-Control-otsakkeesta

Cache-Control: no-cache, no-store, must-revalidate

Expires-otsake määrittää aikaleiman, jolloin kyseinen sisältö tulisi merkitä vanhentuneeksi. Nämä esimerkit määrittävät tiedon olevan jo valmiiksi vanhentunutta. Tämänkaltaista vanhenemisotsaketta tulisi käyttää yhdessä Cache-Control -otsakkeen kanssa.

Esimerkkejä Expires-otsakkeesta

Expires: Thu, 01 Jan 1970 00:00:00 GMT
Expires: 0



Public key pinning

Julkisen avaimen sitominen (public key pinning) tarkoittaa, että palvelimelta hyväksytään vain ennakkoon määritelty julkinen avain tai varmenne. Tämän tietoturvaominaisuuden tarkoitus oli pienentää riskiä siitä, että hyökkääjän avaimelle myönnetään varmenne, joka mahdollistaa palvelimeksi tekeytymisen.

Tuki julkisen avaimen sitomiselle on kuitenkin poistumassa selaimista, koska siitä ei tullut kovin suosittua ja koska sitä käytettäessä on suuri riski itseaiheutetusta palvelunestotilasta. Jotkin selaimet tukevat sitä edelleen, mutta huomionarvioisesti Chrome poisti sen käytöstä ja Safari ei koskaan tukenutkaan sitä.

Julkisen avaimen sitomista tulisi edelleen käyttää mobiilikehityksessä, jossa mobiilisovellukselle on helpompaa määritellä luotettujen varmenteiden joukko, ja luotetut varmenteet voidaan hätätilassa päivittää ohjelmistopäivityksellä sovelluskauppojen kautta.

Julkisen avaimen sitominen selaimissa tehdään HPKP-otsakkeella, Public-Key-Pins.

HPKP:n sijaan organisaation tulisi aktiivisesti seurata Certificate Transparency -lokeja ja reagoida, jos heidän hallussaan oleville domaineille myönnetään varmenteita ilman lupaa.




Referrer-policy ja noopener

Osana HTTP-otsakkeiden oikein määrittelyä kannattaa myös varmistaa, että uuteen välilehteen avautuvilla ulkoisilla (ja ei välttämättä luotetuilla) linkeillä on asetettu attribuutti rel=noopener. noopener-attribuutti estää sen, ettei uudessa välilehdessä avattu sivusto voi ohjata alkuperäistä välilehteä uudelleen esimerkiksi tietojenkalastelusivustolle. Mikäli tuki Internet Explorer 11 -selaimelle on tärkeää, tämän lisäksi asetetaan rel=noreferrer, jolla on sama (sivu)vaikutus.

Ulkoisiin kohteisiin linkitettyjen pyyntöjen mukana kulkee myös Referrer-otsake. Tämä saattaa vuotaa tietoja siitä, mitä henkilö oli tekemässä ennen kuin hän seurasi sivulla olevaa linkkiä. Väärin toteutetuissa sovelluksissa Referrer-tieto saattaa vuotaa myös esimerkiksi tunnisteita. Tämän vuoksi on suositeltavaa asettaa Referrer-Policy -otsake, esimerkiksi

Referrer-Policy: same-origin

Esimerkin otsake lähettää Referrer-tiedot vain samalle sivustolle kuin missä linkkikin oli. Näin sivuston omat tilastoinnit eivät mene rikki. Sivustoilla, joilla tieto siellä käymisestäkin saattaa olla arkaluontoista, otsakkeelle voi antaa arvon no-referrer.




Vanhat, poistuvat otsakkeet

Seuraavat otsakkeet ovat poistuvia otsakkeita, jotka ovat korvautuneet selainten uusilla ominaisuuksilla tai Content Security Policy -otsakkeella.

Koska TLS-vaatimukset estävät monien vanhojen selainten käytön, vanhat otsakkeet ovat tarpeen lähinnä Internet Explorer 11:n vuoksi.

Kirjoitushetkellä näiden otsakkeiden tarve poistunee viimeistään Windows 10:n myötä 2025, elleivät uudet TLS-vaatimukset sulje IE 11:tä pois ennen sitä.

X-Content-Type-Options

Estää selaimia arvaamasta sisällön tyyppiä. Yleisesti ottaen kaikkien palvelimen vastausten tulisi aina määritellä sisällön tyyppi Content-Type -otsakkeella, jossa pitäisi myös määrittää käytetty merkistö, jos sisältötyyppi on tekstiä.

Esimerkki X-Content-Type-Options -otsakkeesta

X-Content-Type-Options: nosniff

X-XSS-Protection

Kertoo selaimelle ottaa käyttöön suojaukset XSS-hyökkäyksiä vastaan. Tämä on vanha otsake ja sisällytetty ainoastaan Internet Explorer 11:n vuoksi, joka ei tue Content Security Policyä. Moderni vaihtoehto on Content Security Policy, joka ei salli unsafe-inlineä.

Esimerkki X-XSS-Protection -otsakkeesta

X-XSS-Protection: 1; mode=block

X-Frame-Options

X-Frame-Options -otsakkeella voidaan estää selaimia upottamasta sivua osaksi toista sivustoa. Tätä käytetään suojaamaan käyttäjiä clickjacking-hyökkäyksiltä, jossa käyttäjä houkutellaan painamaan selaimessa linkkiä, jonka "eteen" on asetettu näkymätön linkki, jota käyttäjä todellisuudessa tulee painaneeksi.

Nykyaikaisilla selaimilla Content Security Policy tason 2 frame-ancestors -direktiivillä saadaan aikaan sama efekti. Content Security Policyssä on lisäksi frame-src -direktiivi, jolla kontrolloidaan sivun itse lataamia kehyksiä, ja tätä X-Frame-Options ei kata.

Esimerkkejä X-Frampe-Options -otsakkeesta

X-Frame-Options: DENY
X-Frame-Options: SAMEORIGIN
X-Frame-Options: ALLOW-FROM https://example.com/