Celovit vodnik po politiki varnosti vsebine (CSP) in drugih varnostnih glavah za frontend, ki ščitijo spletne aplikacije pred napadi in izboljšujejo varnost uporabnikov po svetu.
Varnostne glave za frontend: Obvladovanje politike varnosti vsebine (CSP)
V današnjem digitalnem okolju, kjer so spletne aplikacije vse bolj kompleksne in medsebojno povezane, je zaščita pred varnostnimi grožnjami ključnega pomena. Medtem ko je varnosti zalednega sistema (backend) pogosto namenjene veliko pozornosti, je varnost uporabniškega vmesnika (frontend) enako pomembna. Varnostne glave za frontend delujejo kot prva obrambna linija, saj brskalniku dajejo navodila, kako naj se obnaša, in ščitijo uporabnike pred različnimi napadi. Med temi glavami izstopa politika varnosti vsebine (Content Security Policy - CSP) kot močno orodje za zmanjšanje širokega spektra tveganj.
Kaj so varnostne glave za frontend?
Varnostne glave za frontend so glave odgovora HTTP, ki jih spletni strežnik pošlje brskalniku. Te glave vsebujejo navodila o tem, kako naj brskalnik ravna s prejeto vsebino. Pomagajo preprečevati pogoste napade, kot so:
- Medmestno skriptiranje (XSS): Vstavljanje zlonamernih skript v zaupanja vredne spletne strani.
- Clickjacking (ugrabitev klika): Prevara uporabnikov, da kliknejo na nekaj drugega, kot se jim zdi.
- Napadi "človek v sredini" (Man-in-the-Middle): Prestrezanje komunikacije med uporabnikom in strežnikom.
Nekatere najpomembnejše varnostne glave za frontend vključujejo:
- Content Security Policy (CSP): Določa vire, iz katerih brskalnik sme nalagati vsebino.
- Strict-Transport-Security (HSTS): Prisili brskalnik, da za vso komunikacijo s spletno stranjo uporablja HTTPS.
- X-Frame-Options: Preprečuje vdelavo spletne strani v iframe, kar zmanjšuje tveganje za napade clickjacking.
- X-XSS-Protection: Omogoči vgrajeni filter XSS v brskalniku. (Opomba: Pogosto ga nadomešča CSP, vendar še vedno lahko nudi dodatno raven zaščite).
- Referrer-Policy: Nadzoruje količino informacij o viru (referrer), ki se pošiljajo z zahtevami.
- Feature-Policy (zdaj Permissions-Policy): Razvijalcem omogoča selektivno omogočanje in onemogočanje funkcij in API-jev brskalnika.
Poglobljen pregled politike varnosti vsebine (CSP)
Politika varnosti vsebine (CSP) je glava odgovora HTTP, ki nadzoruje vire, ki jih lahko uporabniški agent naloži za določeno stran. V bistvu ustvari seznam dovoljenih virov odobrene vsebine, kar znatno zmanjša tveganje za napade XSS. Z eksplicitnim definiranjem izvorov, iz katerih se lahko nalagajo viri, kot so skripte, slogovne datoteke, slike in pisave, CSP napadalcem otežuje vbrizgavanje zlonamerne kode na vašo spletno stran.
Kako deluje CSP
CSP deluje tako, da brskalniku posreduje seznam odobrenih virov za različne vrste vsebin. Ko brskalnik naleti na vir, ki krši CSP, ga blokira in prijavi kršitev. Ta mehanizem blokiranja preprečuje izvajanje zlonamerne kode, tudi če napadalcu uspe, da jo vbrizga v HTML.
Direktive CSP
Direktive CSP so osrednji deli politike CSP. Določajo dovoljene vire za različne vrste virov. Nekatere najpogosteje uporabljene direktive vključujejo:
- default-src: Določi privzeti vir za vse vrste virov. To je rezervna direktiva, ki se uporabi, kadar druge, bolj specifične direktive niso določene.
- script-src: Določa dovoljene vire za JavaScript.
- style-src: Določa dovoljene vire za slogovne datoteke CSS.
- img-src: Določa dovoljene vire za slike.
- font-src: Določa dovoljene vire za pisave.
- media-src: Določa dovoljene vire za avdio in video.
- object-src: Določa dovoljene vire za vtičnike, kot je Flash. (Na splošno je najbolje, da se vtičnikom izogibate, če je mogoče).
- frame-src: Določa dovoljene vire za okvirje (iframes).
- connect-src: Določa dovoljene vire za omrežne zahteve (AJAX, WebSockets).
- base-uri: Omejuje URL-je, ki se lahko uporabljajo v elementu
<base>. - form-action: Omejuje URL-je, na katere se lahko pošiljajo obrazci.
- frame-ancestors: Določa veljavne nadrejene elemente, ki lahko vdelajo stran z uporabo
<frame>,<iframe>,<object>,<embed>ali<applet>. Ta direktiva nudi zaščito pred napadi clickjacking. - upgrade-insecure-requests: Naroči uporabniškim agentom, naj vse nezavarovane URL-je spletnega mesta (naložene preko HTTP) obravnavajo, kot da so bili zamenjani z varnimi URL-ji (naloženimi preko HTTPS). Ta direktiva je namenjena spletnim mestom, ki so v procesu migracije s HTTP na HTTPS.
- report-uri: Določa URL, na katerega naj brskalnik pošilja poročila o kršitvah CSP. Opuščeno v korist `report-to`.
- report-to: Določa ime skupine, definirano v glavi `Report-To`. To omogoča natančnejši nadzor nad poročanjem, vključno z določitvijo več končnih točk za poročanje.
Vrednosti virov CSP
Vrednosti virov določajo izvore, iz katerih je dovoljeno nalaganje virov. Nekatere pogoste vrednosti virov vključujejo:
- *: Dovoljuje vsebino iz katerega koli vira (Izogibajte se uporabi v produkciji!).
- 'self': Dovoljuje vsebino iz istega izvora (shema, gostitelj in vrata) kot zaščiteni dokument.
- 'none': Ne dovoljuje vsebine iz nobenega vira.
- 'unsafe-inline': Dovoljuje uporabo vgrajenega JavaScripta in CSS-a (Izogibajte se uporabi v produkciji!).
- 'unsafe-eval': Dovoljuje uporabo dinamičnega izvajanja kode (npr.
eval(),Function()) (Izogibajte se uporabi v produkciji!). - 'strict-dynamic': Določa, da se zaupanje, eksplicitno dodeljeno skriptu v oznakah z dodanim noncem ali zgoščeno vrednostjo, prenese na vse skripte, ki jih naloži ta prednik.
- 'unsafe-hashes': Dovoljuje specifične vgrajene obravnavalnike dogodkov. To se na splošno odsvetuje zaradi kompleksnosti in omejene koristi.
- data:: Dovoljuje nalaganje virov iz URL-jev z podatki (npr. vdelane slike). Uporabljajte previdno.
- mediastream:: Dovoljuje uporabo URI-jev `mediastream:` kot vira medijev.
- blob:: Dovoljuje uporabo URI-jev `blob:` kot vira medijev.
- filesystem:: Dovoljuje nalaganje virov iz datotečnega sistema.
- https://example.com: Dovoljuje vsebino iz določene domene in vrat.
- *.example.com: Dovoljuje vsebino iz katere koli poddomene example.com.
- nonce-{random-value}: Dovoljuje skripte ali sloge z ujemajočim se atributom nonce. To zahteva strežniško generiranje naključne vrednosti nonce za vsako zahtevo.
- sha256-{hash-value}: Dovoljuje skripte ali sloge z ujemajočo se zgoščeno vrednostjo SHA256, SHA384 ali SHA512.
Načini delovanja CSP: Uveljavljanje vs. Samo poročanje
CSP se lahko uporablja v dveh načinih:
- Način uveljavljanja (Enforce Mode): V tem načinu brskalnik blokira vse vire, ki kršijo CSP. To je priporočen način za produkcijska okolja. CSP se pošlje z glavo `Content-Security-Policy`.
- Način samo poročanja (Report-Only Mode): V tem načinu brskalnik poroča o kršitvah CSP, vendar virov ne blokira. To je uporabno za testiranje in ocenjevanje CSP pred uveljavitvijo. CSP se pošlje z glavo `Content-Security-Policy-Report-Only`.
Implementacija CSP: Vodnik po korakih
Implementacija CSP se morda zdi zastrašujoča, vendar lahko z urejenim pristopom učinkovito zavarujete svojo spletno aplikacijo.
1. Začnite s politiko v načinu samo poročanja
Začnite z uvedbo CSP v načinu samo poročanja. To vam omogoča spremljanje kršitev, ne da bi motili delovanje vaše spletne strani. Konfigurirajte direktivo report-uri ali report-to za pošiljanje poročil o kršitvah na določeno končno točko.
Primer glave (samo poročanje):
Content-Security-Policy-Report-Only: default-src 'self'; report-uri /csp-report
2. Analizirajte poročila o kršitvah
Skrbno analizirajte poročila o kršitvah, da ugotovite, kateri viri so blokirani in zakaj. To vam bo pomagalo razumeti odvisnosti virov vaše spletne strani in prepoznati morebitne varnostne ranljivosti.
Poročila o kršitvah se običajno pošiljajo kot JSON tovori na konfigurirano končno točko report-uri ali report-to. Ta poročila vsebujejo informacije o kršitvi, kot so blokirani URI, kršena direktiva in URI dokumenta.
3. Izboljšajte politiko CSP
Na podlagi poročil o kršitvah izboljšajte svojo politiko CSP, da dovolite legitimne vire, hkrati pa ohranite močno varnostno držo. Dodajte specifične vrednosti virov za vire, ki so blokirani. Razmislite o uporabi noncev ali zgoščenih vrednosti za vgrajene skripte in sloge, da se izognete uporabi 'unsafe-inline'.
4. Prehod na način uveljavljanja
Ko ste prepričani, da vaša politika CSP ne blokira legitimnih virov, preidite na način uveljavljanja. To bo blokiralo vse preostale kršitve in zagotovilo robustno plast zaščite pred napadi XSS.
Primer glave (uveljavljanje):
Content-Security-Policy: default-src 'self'; script-src 'self' https://example.com; style-src 'self' 'unsafe-inline'; img-src 'self' data:; report-uri /csp-report
5. Spremljajte in vzdržujte politiko CSP
CSP ni rešitev, ki jo nastavite in pozabite. Bistveno je, da nenehno spremljate svojo politiko CSP in jo posodabljate, ko se vaša spletna stran razvija in se pojavljajo nove varnostne grožnje. Redno pregledujte poročila o kršitvah in po potrebi prilagajajte politiko.
Praktični primeri CSP
Poglejmo si nekaj praktičnih primerov CSP za različne scenarije:
Primer 1: Osnovni CSP za preprosto spletno stran
Ta CSP dovoljuje vsebino iz istega izvora in slike iz katerega koli vira.
Content-Security-Policy: default-src 'self'; img-src *
Primer 2: CSP s specifičnimi viri za skripte in sloge
Ta CSP dovoljuje skripte iz istega izvora in iz določenega CDN-ja ter sloge iz istega izvora in vgrajene sloge.
Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.example.com; style-src 'self' 'unsafe-inline'
Primer 3: CSP z nonci za vgrajene skripte
Ta CSP zahteva edinstven nonce za vsak vgrajen skript.
Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-r4nd0mn0nc3'
HTML:
<script nonce="r4nd0mn0nc3">console.log('Pozdravljen, svet!');</script>
Pomembno: Vrednost nonce mora biti dinamično generirana na strežniku za vsako zahtevo. To preprečuje napadalcem, da bi ponovno uporabili nonce.
Primer 4: CSP, ki omejuje prednike okvirjev za preprečevanje clickjackinga
Ta CSP preprečuje, da bi bila stran vdelana v iframe na kateri koli domeni, razen na `https://example.com`.
Content-Security-Policy: frame-ancestors 'self' https://example.com
Primer 5: Strožji CSP z uporabo 'strict-dynamic' in rezervno možnostjo 'self'
Ta CSP izkorišča `strict-dynamic` za sodobne brskalnike, hkrati pa podpira starejše brskalnike, ki te možnosti ne podpirajo. Vključuje tudi `report-uri` za spremljanje kršitev.
Content-Security-Policy: default-src 'self'; script-src 'strict-dynamic' 'nonce-{random-nonce}' 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; report-uri /csp-report
Ne pozabite zamenjati `{random-nonce}` z dinamično generirano vrednostjo nonce na strani strežnika.
CSP in enostranske aplikacije (SPA)
Implementacija CSP v enostranskih aplikacijah (SPA) je lahko zahtevna zaradi dinamične narave teh aplikacij. SPA se pogosto močno zanašajo na JavaScript za generiranje in manipulacijo DOM-a, kar lahko privede do kršitev CSP, če se ne ravna previdno.
Tukaj je nekaj nasvetov za implementacijo CSP v SPA:
- Izogibajte se
'unsafe-inline'in'unsafe-eval': Tem direktivam se je treba v SPA izogibati, kadar koli je to mogoče. Znatno oslabijo varnost vaše aplikacije. - Uporabite nonce ali zgoščene vrednosti: Uporabite nonce ali zgoščene vrednosti za vgrajene skripte in sloge. To je priporočen pristop za SPA.
- Razmislite o Trusted Types: Trusted Types je API brskalnika, ki pomaga preprečevati ranljivosti XSS, ki temeljijo na DOM-u. Uporablja se lahko v povezavi s CSP za dodatno izboljšanje varnosti.
- Uporabite ogrodje, združljivo s CSP: Nekatera ogrodja za frontend (kot so React z določenimi konfiguracijami, Angular in Vue.js) nudijo funkcije, ki vam pomagajo lažje implementirati CSP.
Druge pomembne varnostne glave za frontend
Čeprav je CSP temelj varnosti frontenda, imajo tudi druge glave ključno vlogo pri zagotavljanju celovite obrambne strategije:
Strict-Transport-Security (HSTS)
Glava Strict-Transport-Security (HSTS) naroči brskalniku, naj za povezavo s spletno stranjo vedno uporablja HTTPS. To preprečuje napade "človek v sredini", ki poskušajo znižati raven povezave na HTTP.
Primer glave:
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
max-age: Določa trajanje (v sekundah), za katero si mora brskalnik zapomniti, da dostopa do strani samo preko HTTPS. Vrednost 31536000 sekund (1 leto) je priporočljiva za produkcijska okolja.includeSubDomains: Označuje, da se politika HSTS nanaša na vse poddomene domene.preload: Omogoča, da se domena vključi na seznam domen z omogočenim HSTS, ki je vnaprej naložen v brskalnike. To zahteva oddajo vaše domene na seznam za prednalaganje HSTS, ki ga vzdržuje Google.
X-Frame-Options
Glava X-Frame-Options preprečuje napade clickjacking z nadzorom, ali je spletno stran mogoče vdelati v iframe.
Primer glave:
X-Frame-Options: DENY
Možne vrednosti:
DENY: Preprečuje prikaz strani v iframu, ne glede na izvor.SAMEORIGIN: Dovoljuje prikaz strani v iframu samo, če se izvor iframa ujema z izvorom strani.ALLOW-FROM uri: Dovoljuje prikaz strani v iframu samo, če se izvor iframa ujema z navedenim URI-jem. Opomba: Ta možnost je zastarela in je morda ne podpirajo vsi brskalniki.
Opomba: Direktiva frame-ancestors v CSP nudi bolj prilagodljiv in močan način nadzora vdelovanja in je na splošno prednostna pred X-Frame-Options.
X-XSS-Protection
Glava X-XSS-Protection omogoča vgrajeni filter XSS v brskalniku. Čeprav je CSP robustnejša rešitev za preprečevanje napadov XSS, lahko ta glava nudi dodatno raven zaščite, zlasti za starejše brskalnike, ki morda ne podpirajo v celoti CSP.
Primer glave:
X-XSS-Protection: 1; mode=block
1: Omogoči filter XSS.0: Onemogoči filter XSS.mode=block: Naroči brskalniku, naj blokira stran, če je zaznan napad XSS.report=uri: Določa URL, na katerega naj brskalnik pošlje poročilo, če je zaznan napad XSS.
Referrer-Policy
Glava Referrer-Policy nadzoruje količino informacij o viru (referrer), ki se pošiljajo z zahtevami. Informacije o viru se lahko uporabijo za sledenje uporabnikov med spletnimi stranmi, zato lahko nadzor nad njimi izboljša zasebnost uporabnikov.
Primer glave:
Referrer-Policy: strict-origin-when-cross-origin
Nekatere pogoste vrednosti:
no-referrer: Nikoli ne pošlje glave Referer.no-referrer-when-downgrade: Ne pošlje glave Referer izvorom brez TLS (HTTPS).origin: Pošlje samo izvor (shemo, gostitelja in vrata) v glavi Referer.origin-when-cross-origin: Pošlje izvor za zahteve med različnimi izvori in celoten URL za zahteve iz istega izvora.same-origin: Pošlje glavo Referer za zahteve iz istega izvora, ne pa tudi za zahteve med različnimi izvori.strict-origin: Pošlje samo izvor, ko raven varnosti protokola ostane enaka (HTTPS na HTTPS), vendar ne pošlje glave na manj varno destinacijo (HTTPS na HTTP).strict-origin-when-cross-origin: Pošlje izvor pri izvajanju zahteve iz istega izvora. Pri zahtevah med različnimi izvori pošlje izvor samo, ko raven varnosti protokola ostane enaka (HTTPS na HTTPS), vendar ne pošlje glave na manj varno destinacijo (HTTPS na HTTP).unsafe-url: Pošlje celoten URL v glavi Referer, ne glede na izvor. Uporabljajte z izjemno previdnostjo, saj lahko to razkrije občutljive informacije.
Permissions-Policy (prej Feature-Policy)
Glava Permissions-Policy (prej znana kot Feature-Policy) omogoča razvijalcem selektivno omogočanje in onemogočanje funkcij in API-jev brskalnika. To lahko pomaga zmanjšati površino napada vaše aplikacije in izboljšati zasebnost uporabnikov.
Primer glave:
Permissions-Policy: geolocation=()
Ta primer onemogoči API za geolokacijo za spletno stran.
Druge funkcije, ki jih je mogoče nadzorovati s Permissions-Policy, vključujejo:
cameramicrophonegeolocationaccelerometergyroscopemagnetometerusbmidipaymentfullscreen
Nastavljanje varnostnih glav na različnih platformah
Metoda za nastavljanje varnostnih glav se razlikuje glede na spletni strežnik ali platformo, ki jo uporabljate. Tukaj je nekaj pogostih primerov:
Apache
Varnostne glave v Apacheu lahko nastavite tako, da jih dodate v datoteko .htaccess ali konfiguracijsko datoteko strežnika (httpd.conf).
Primer konfiguracije .htaccess:
<IfModule mod_headers.c>
Header set Content-Security-Policy "default-src 'self'; script-src 'self' https://cdn.example.com; style-src 'self' 'unsafe-inline'; img-src 'self' data:; report-uri /csp-report"
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Header set X-Frame-Options "DENY"
Header set X-XSS-Protection "1; mode=block"
Header set Referrer-Policy "strict-origin-when-cross-origin"
</IfModule>
Nginx
Varnostne glave v Nginxu lahko nastavite tako, da jih dodate v blok strežnika v konfiguracijski datoteki Nginxa (nginx.conf).
Primer konfiguracije Nginx:
server {
listen 443 ssl;
server_name example.com;
add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://cdn.example.com; style-src 'self' 'unsafe-inline'; img-src 'self' data:; report-uri /csp-report";
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
add_header X-Frame-Options "DENY";
add_header X-XSS-Protection "1; mode=block";
add_header Referrer-Policy "strict-origin-when-cross-origin";
...
}
Node.js (Express)
Varnostne glave v Node.js lahko nastavite z uporabo vmesne programske opreme, kot je Helmet.
Primer z uporabo Helmet:
const express = require('express');
const helmet = require('helmet');
const app = express();
app.use(helmet());
// Po potrebi prilagodite CSP
app.use(helmet.contentSecurityPolicy({
directives: {
defaultSrc: ["'self'"],
scriptSrc: ["'self'", "https://cdn.example.com"],
styleSrc: ["'self'", "'unsafe-inline'"],
imgSrc: ["'self'", "data:"],
reportUri: '/csp-report'
},
}));
app.get('/', (req, res) => {
res.send('Pozdravljen, svet!');
});
app.listen(3000, () => {
console.log('Strežnik posluša na vratih 3000');
});
Cloudflare
Cloudflare vam omogoča nastavitev varnostnih glav z uporabo njihovih pravil za strani (Page Rules) ali pravil za preoblikovanje (Transform Rules).
Testiranje vaših varnostnih glav
Po implementaciji varnostnih glav je ključno, da jih testirate, da zagotovite njihovo pravilno delovanje. Več spletnih orodij vam lahko pomaga analizirati varnostne glave vaše spletne strani:
- SecurityHeaders.com: Preprosto in učinkovito orodje za analizo varnostnih glav.
- Mozilla Observatory: Celovito orodje za testiranje varnosti spletnih strani, vključno z varnostnimi glavami.
- WebPageTest.org: Omogoča ogled glav HTTP v diagramu slapa (waterfall chart).
Zaključek
Varnostne glave za frontend, zlasti politika varnosti vsebine (CSP), so bistvenega pomena za zaščito spletnih aplikacij pred različnimi napadi in izboljšanje varnosti uporabnikov. S skrbno implementacijo in vzdrževanjem teh glav lahko znatno zmanjšate tveganje za XSS, clickjacking in druge varnostne ranljivosti. Ne pozabite začeti s politiko v načinu samo poročanja, analizirati poročila o kršitvah, izboljšati politiko in nato preiti na način uveljavljanja. Redno spremljajte in posodabljajte svoje varnostne glave, da bo vaša spletna stran varna, ko se razvija in se pojavljajo nove grožnje.
S proaktivnim pristopom k varnosti frontenda lahko zgradite bolj varne in zaupanja vredne spletne aplikacije, ki ščitijo vaše uporabnike in vaše poslovanje.