HTTP saugumo antraštės

Iš IV pagalba klientams.
Peršokti į: navigacija, paiešką

HTTP protokolas suteikia galimybę naudoti įvairių tipų antraštes norint apsaugoti svetainės bei jos lankytojų duomenų saugumą. Tam yra naudojamos Cache-control Headers bei Security Headers. Naudojant HTTP antraštes naršyklės atsižvelgia į pateiktas taisykles ir jomis vadovaujasi užkraunant svetainės turinį bei saugant laikinuosius duomenis. Abiejų tipų antraštes rekomenduojame naudoti, nes:

  • laikinosios atminties (HTTP Cache headers) antraštės padės apriboti naršyklėje saugomų duomenų kiekį bei atsinaujinimo periodiškumą.
  • saugumo (HTTP Security headers) antraštės apsaugos Jūsų svetainę nuo turinio vagystės ar galimos atakos.

SVARBU: prieš naudojant, kurią nors iš antraščių, rekomenduojame ją visų pirmą išmėginti Jūsų testinėje svetainėje, nes svetainės veikimas gali būti sutrikdytas ir nesėkmės atveju lankytojai laikinai jos nepasieks.

Visi pavyzdžiai tinkami serveriams, kurie naudoja Apache web tarnybą bei PHP programavimo kalbą.


Bendra informacija

Norėdami įjungti įvesti antraštes savo svetainėje, rekomenduotume savo svetainės faile (-uose) su PHP programiniu kodu nurodyti žemiau esantį kodą. Šis kodas turėtų būti įterptas į failą, kuris visada yra užkraunamas naršant po Jūsų svetainę. Jei naudojate turinio valdymo sistemą pvz. Wordpress Jums šį kodą reikės įterpti į dizaino temos "header.php" failą (kitose turinio valdymo sistemos failas gali būti kitoks):

<?php
 header("Antraštės-pavadinimas-ir-naudojamos-reikšmės"");
?>

Jeigu Jūsų svetainė yra parašyta su HTML programiniu kodu, šis kodas turi būti aprašytas .htaccess faile. Naudojami tokie patys pagrindiniai parametrai, tačiau naudojama ir papildoma šiam failui reikalinga sintaksė, pavyzdžiui:

Header always set Antraštės-pavadinimas "naudojamos-reikšmės"

HSTS veikimui papildomai turi būti sukurtas automatinis peradresavimą į HTTPS protokolą. Peradresavimą į HTTPS esame aprašę kitoje savo pamokoje.

Cache-control

Šios antraštės naršyklėms nurodo duomenų saugojimo principą gaunamoms kliento užklausos bei serverio grąžinamam atsakymui iš HTTP protokolo pusės. Nurodyta taisyklės apibrėžia kaip turi būti saugoma laikinoji atmintis, kur gali būti saugoma bei kiek laiko turi būti saugoma. Standartinis įrašas gali atrodyti taip:

Cache-Control: private, max-age=0, no-cache"

Naudojamos reikšmės:

  • private arba public. Public nurodo, kad visos laikinosios atminties saugojimas galimas net ir tada kai HTTP autorizacija ar HTTP atsakas nėra gaunamas. Šio parametro naudojimas nėra būtinas, nes ar turinys gali būti saugomas apibrėžia kitas parametras max-age, kuris nurodo saugojimo laiką. Private naudojamas nurodant, kad privati informacija gali būti saugoma kliento naršyklėje, tačiau negali būti saugoma CDN (anbl. content distribution network) serveriuose.
  • max-age - nurodomas ilgiausias laikas (sekundėmis) per kurį gali būti saugoma informacija ir naudojama pakartotinai nuo pirmo išsaugojimo.
  • no-cache arba no-store. Naudojant no-cache naršyklė kiekvienu atidarymu naršyklė papildomai patikrina ar nėra pasikeitųsi informacija. no-store nurodo, kad nebūtų saugoja jokia privati informacija nei tarpiniuose serveriuose nei naršyklėse. Kiekvieno prisijungimo metu ši informacija būna užkraunama iš naujo.
  • must-revalidate - nurodo, kad kiekvieną kartą užkraunama informacija turi būti pakartotinai ratifikuojama, o pasenusio ratifikavimo informacija negali būti naudojama.
  • immutable - atnaujinimas nebus atliekamas net jei lankytojas atliks puslapio perkrovimą (veikia ne su visomis naršyklėmis).

Daugiau Cache-Control naudojamų reikšmių galite rasti šiuo adresu


Expires

Senesnio tipo atminties saugojimo metodas, kuris tiesiog apibrėžia laiką iki kada gali būti saugoma laikinoji atmintis. Dažniausiai veikia senesnėse neatnaujintose naršyklėse. Rekomenduojame naudoti ir Cache-Control ir Expires antraštę tam, kad atminties saugojimas veiktų visiems lankytojams. Antraštės pavyzdys:

Expires: Sun, 03 May 2021 23:02:37 GMT

Jeigu naudosite Cache-Control ir Expires vienu metu, rekomenduojame naudoti sutampančias reikšmės. Taip pat rekomenduotina, kad nebūtų abiejuose reikšmėse nebūtų nurodomas ilgesnis laikotarpis nei metai.


HTTP Strict Transport Security (HSTS)

Tai yra interneto svetainių saugumo mechanizmas, skirtas apsaugoti svetainę nuo duomenų nutekėjimo. Šis mechanizmas leidžia svetainei nurodyti, kad interneto naršyklės turi ją atidaryti tik saugiu HTTPS protokolu ir negali užmegzti susijungimo HTTP protokolu.

Svetainės savininkas HTTP antraščių pagalba gali nurodyti, kaip ateityje interneto naršyklėms reikėtų užmegzti ryšį su jo svetaine. Pavyzdžiui, nurodžius antraštę Strict-Transport-Security: max-age=31536000 - tai reikš, kad ateinančias 31536000 sekundžių (365 dienas) visos naršyklės su svetaine ryšį turės užmegzti tik HTTPS protokolu.

Šio mechanizmo esminiai veikimo principai yra:

  1. Visos svetainės nuorodos priverstinai pakeičiamos į saugias, pavyzdžiui nuoroda http://mano-svetaine.lt/idomus-straipsnis.html bus pakeista į https://mano-svetaine.lt/idomus-straipsnis.html dar prieš pilnai užkraunant visą svetainę.
  2. Jei saugus susijungimas negali būti užmegztas (serveryje nėra įdiegtas SSL sertifikatas), tada pateikiamas klaidos pranešimas.

HSTS mechanizmas pilnai apsaugo nuo trečių šalių įsikišimo tarp lankytojo ir serverio. Vienintelis minusas yra tai, kad interneto naršyklėse, per kurias lankytojai pirmą kartą atidarys atitinkamą interneto svetainę, pirmojo susijungimo metu dar gali būti bandoma svetainę pasiekti HTTP protokolu. Norint išspręsti šią problemą, galima įtraukti savo svetainę į specialų HSTS mechanizmą naudojančių svetainių sąrašą (hstspreload.org)

SVARBU - prieš išsaugodami HSTS parametrus įsitikinkite, kad domenas bei naudojami subdomenai palaiko HTTPS sertifikatą. HSTS parametrai po įvedimo svetainėje būna išsaugomi naršyklėje globaliai. Gali užtrukti kelis mėnesiui kol naršyklė atliks atnaujinimą ir priverstinai nebevykdys peradresavimo į HTTPS protokolą. Tol kol HSTS įrašas nebus pašalinamas iš naršyklės bus atliekamas priverstinį peradresavimas ir Jūsų svetainė nebus atvaizduojama.

Norėdami įjungti HSTS savo svetainėje, rekomenduotume savo svetainės faile (-uose) su PHP programiniu kodu nurodyti žemiau esantį kodą. Šis kodas turėtų būti įterptas į failą, kuris visada yra užkraunamas naršant po Jūsų svetainę. Jei naudojate turinio valdymo sistemą pvz. Wordpress Jums šį kodą reikės įterpti į dizaino temos "header.php" failą (kitose turinio valdymo sistemos failas gali būti kitoks):

Strict-Transport-Security:max-age=63072000; includeSubdomains; preload

Naudojamos reikšmės:

  • max-age - leidžia nurodyti norimą laiką, "31536000" - 12 mėnesių arba "63072000" - 24 mėnesiai.
  • includeSubdomains reiškia, kad ir visi subdomenai bus pasiekiami HTTPS prievadu.
  • preload nurodykite, jei norite įtraukti svetainę į HSTS mechanizmą naudojančių svetainių sąrašą (hstspreload.org).

Patikrinimui ar HSTS buvo įvestas sėkmingai, galite naudoti šią patikros formą: https://hstspreload.org/


Content Security Policy (CSP)

Šios antraštes svetainės programuotojui leidžia nurodyti, koks turinys gali būti pasiekiamas lankytojas taip uždraudžiant kito turinio pasiekiamumą. CSP padeda apsisaugoti nuo XSS ir kitų kodo įterpimo atakų. Nors naudojant šią antraštę nėra visiškai eliminuojama galimybę pasiekti šį turinį, tačiau tai tikrai apsunkina galima žalingo kodo sklaidą. Taisyklės pavyzdys:

Content-Security-Policy: <taisyklė>; <taisyklė>

Naudojamos reikšmės:

  • img-src - nurodomi tinkami nuotraukų resursus;
  • connect-src - apriboja URL adresus, kurie gali būti užkraunami naudojant skripto sąsajas;
  • object-src - nurodo galimus resursus <object>, <embed> ir <applet> elementams;
  • script-src - nurodo galimus resursus Javascript kodo naudojimui;
  • base-uri - apriboja URL adresus, kurie gali būti naudojami dokumentų <base> elemente.

Žemiau pateikiame pavyzdį, kuriuo aprašoma, kad išjungiamas nesaugus eval elementas, galima užkrauti tik nuotraukas, skriptus ir pan. naudojant HTTPS protokolą:

// antraštė
Content-Security-Policy: default-src https:
// meta žymė
<meta http-equiv="Content-Security-Policy" content="default-src https:">

Daugiau pavyzdžių ir galimų reikšmių rasite šiuo adresu.


Cross Site Scripting Protection (X-XSS)

Šio tipo antraštes padeda apsisaugoti konkrečiai nuo galimybės įterpti žalingą kodą į svetainės turinį matomą lankytojams. Šis tipas yra automatiškai įjungiamas Chrome, Internet Explorer ir Safari naršyklėse. Naudojant šią antraštę svetainė nėra užkraunama, jeigu pastebima galima ataka. Šis antraščių tipas nėra reikalingas naujesnio tipo naršyklėse kai jau būna naudojamos CSP antraštės, tačiau senesnio tipo naršyklėse rekomenduojame naudoti abu tipus. Antraštės pavyzdys:

X-XSS-Protection: 0
X-XSS-Protection: 1
X-XSS-Protection: 1; mode=block
X-XSS-Protection: 1; report=<informaciją-gausiantis-URI>

Naudojamos reikšmės:

  • 0 - XSS filtravimas išjungtas;
  • 1 - XSS filtravimas įjungtas (dažniausiai pagal nutylėjimą veikia daugumoje naršyklių). Nėra užkraunamas nesaugus turinys, kurį bandoma pažeisti;
  • 1; mode=block - XSS filtravimas įjungtas. Vietoje konkrečių dalių neužkrovimo yra visiškai išjungiamas turinio pateikimas.
  • 1; report=<informaciją-gausiantis-URI> - XSS filtravimas įjungtas. Jeigu pastebima ataka konkretus turinys nėra užkraunamas ir siunčiamas informavimas nurodytu adresu. Tam, kad informavimas būtų siunčiamas turi būti naudojama CSP antraštė su report-uri reikšme.

Daugiau panaudojimo pavyzdžių rasite šiuo adresu.


X-Frame-Options

Šio tipo antraštė apsaugo nuo click-jacking atakų, kurių metu lankytojui yra pateikiamas langas su prašymu atlikti kokį nors pasirinkimą, kuris atlieka kitokią reikšmę nei yra vizualiai atvaizduojama. Nors seniau šios atakos buvo itin dažnos ir dabar jų pastebima vis mažiau, tačiau tokios atakos grėsmė vis dar išlieka. Tokios atakos pavyzdys gali būti prašymas suvesti prisijungimo duomenis apsimetant kitu puslapiu ir pavogiant asmens prisijungimo duomenis prie kurios nors sistemos. Ši antraštė draudžia įterpti kitą turinį į <frame>, <iframe>, <embed> ar <object> elementus. Naudojama sintaksė:

X-Frame-Options: DENY
X-Frame-Options: SAMEORIGIN
X-Frame-Options: ALLOW-FROM https://domenas.lt/

Naudojamos reikšmės:

  • DENY - draudžiamas turinio atvaizdvimas per frame elementą. Draudžiamas užkrovimas tiek naudojant vidinius resursus, tiek išorinius.
  • SAMEORIGIN- gali būti naudojamas frame elementas tik pasitelkiant vidinius resursus. Tačiau ši reikšmė nėra itin naudinga, jei elementas užkraunamas dalinai iš vidinių resursų, dalinai iš išorinių.
  • ALLOW-FROM https://domenas.lt/ - nurodoma, kurios svetainės turinys gali būti naudojamas frame elemente. Vietoje šios reikšmės galite naudoti CSP antraštę su frame-ancestors reikšme.

Daugiau X-Frame-Options naudojamų reikšmių galite rasti šiuo adresu


X-Content-Type-Options

Šio tipo antraštė yra naudojama norint apsisaugoti nuo MIME sniffing atakų. Šių atakų metu yra tikrinamas svetainių turinys ir ieškomos galimos saugumo spragos, naudojamo turinio neatitikimai ar kita informacija galinti padėti įsilaužti į svetainę. Šios atakos taip pat būna naudojamos kodo įterpimo atakoms įgyvendinti. Naudojant X-Content-Type-Options antraštę MIME tipai yra slepiami naršyklės ir viešai nepateikiami. Saugumo antraštės sintaksė:

X-Content-Type-Options: nosniff

Naudojant nosniff reikšmę yra blokuojamos užklausos, jeigu užklausos paskirties reikšmės yra:

  • style ir MIME tipai nėra text/css;
  • script ir MIME tipai nėra JavaScript;

bei įjungiamas CORB režimas MIME tipams:

  • text/html;
  • text/plain;
  • text/json, application/json ar betkokie kiti JSON plėtyniai;
  • text/xml, application/xml ar kiti XML plėtiniai (išskyrus image/svg+xml).

Daugiau X-Frame-Options naudojamų reikšmių galite rasti šiuo adresu


Set-Cookie

Šio tipo antraštė užtikrina, kad laikinieji duomenys cookies būtų siunčiami naudojant HTTPS protokolą t.y. kad duomenys būtų šifruojami. Taip pat naudojant šią antraštę šie duomenys nebus pasiekiami naudojant JavaScript duomenų tipą. Svetainė turi veikti su HTTPS protokolu tam, kad šis tipas veiktų. Naudojamos sintaksės pavyzdys:

Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>; Secure; HttpOnly

Naudojamos reikšmės:

  • <cookie-name> - gali būti naudojamos US-ASCII reikšmės išskyrus tarpus, papildomus simbolius ir pan.
  • <cookie-value> - gali būti naudojamas US-ASCII bei visi kiti simboliai išskyrus dvigubos kabutės, kabliataškį, pasvirusį brūksšnį ir pan.
  • Secure ir "HttpOnly rekomenduojame naudoti visada.

Daugiau Set-Cookie naudojamų reikšmių galite rasti šiuo adresu