Išsamus turinio saugumo politikos (CSP) ir kitų frontend saugumo antraščių vadovas, skirtas apsaugoti žiniatinklio programas nuo atakų ir sustiprinti vartotojų saugumą.
Frontend saugumo antraštės: turinio saugumo politikos (CSP) įsisavinimas
Šiuolaikiniame skaitmeniniame pasaulyje, kuriame žiniatinklio programos tampa vis sudėtingesnės ir labiau susietos, apsauga nuo saugumo grėsmių yra itin svarbi. Nors backend saugumui dažnai skiriamas didelis dėmesys, frontend saugumas yra lygiai taip pat svarbus. Frontend saugumo antraštės veikia kaip pirmoji gynybos linija, suteikdamos mechanizmą, nurodantį naršyklei, kaip elgtis ir apsaugoti vartotojus nuo įvairių atakų. Tarp šių antraščių turinio saugumo politika (CSP) išsiskiria kaip galingas įrankis, padedantis sumažinti daugybę rizikų.
Kas yra frontend saugumo antraštės?
Frontend saugumo antraštės yra HTTP atsakymo antraštės, kurias žiniatinklio serveris siunčia naršyklei. Šiose antraštėse pateikiamos instrukcijos, kaip naršyklė turėtų apdoroti gaunamą turinį. Jos padeda išvengti tokių dažnų atakų kaip:
- Tarpvietinis scenarijų kūrimas (XSS): Kenkėjiškų scenarijų įterpimas į patikimas svetaines.
- Clickjacking: Vartotojų apgaudinėjimas, siekiant priversti juos spustelėti kažką kitą, nei jie suvokia.
- Man-in-the-Middle atakos: Ryšio tarp vartotojo ir serverio perėmimas.
Kai kurios iš svarbiausių frontend saugumo antraščių yra:
- Turinio saugumo politika (CSP): Apibrėžia šaltinius, iš kurių naršyklei leidžiama įkelti resursus.
- Strict-Transport-Security (HSTS): Priverčia naršyklę naudoti HTTPS visam ryšiui su svetaine.
- X-Frame-Options: Neleidžia svetainės įterpti į iframe, taip sumažinant clickjacking atakų riziką.
- X-XSS-Protection: Įjungia naršyklės integruotą XSS filtrą. (Pastaba: dažnai pakeičiama CSP, bet vis dar gali suteikti papildomą apsaugos lygį).
- Referrer-Policy: Kontroliuoja, kiek persiuntimo informacijos siunčiama su užklausomis.
- Feature-Policy (dabar Permissions-Policy): Leidžia kūrėjams pasirinktinai įjungti ir išjungti naršyklės funkcijas ir API.
Išsami turinio saugumo politikos (CSP) analizė
Turinio saugumo politika (CSP) yra HTTP atsakymo antraštė, kuri kontroliuoja, kokius resursus vartotojo agentui leidžiama įkelti tam tikram puslapiui. Ji iš esmės sukuria patvirtinto turinio šaltinių baltąjį sąrašą, taip ženkliai sumažindama XSS atakų riziką. Aiškiai apibrėždama šaltinius, iš kurių galima įkelti resursus, tokius kaip scenarijai, stilių aprašai, paveikslėliai ir šriftai, CSP gerokai apsunkina užpuolikų galimybes įterpti kenkėjišką kodą į jūsų svetainę.
Kaip veikia CSP
CSP veikia pateikdama naršyklei patvirtintų šaltinių sąrašą įvairių tipų turiniui. Kai naršyklė susiduria su resursu, kuris pažeidžia CSP, ji blokuoja resursą ir praneša apie pažeidimą. Šis blokavimo mechanizmas neleidžia vykdyti kenkėjiško kodo, net jei užpuolikas sugeba jį įterpti į HTML.
CSP direktyvos
CSP direktyvos yra pagrindiniai CSP politikos komponentai. Jos nurodo leidžiamus šaltinius įvairių tipų resursams. Kai kurios dažniausiai naudojamos direktyvos:
- default-src: Nustato numatytąjį šaltinį visiems resursų tipams. Tai yra atsarginė direktyva, taikoma, kai nėra apibrėžtų konkretesnių direktyvų.
- script-src: Nurodo leidžiamus JavaScript šaltinius.
- style-src: Nurodo leidžiamus CSS stilių aprašų šaltinius.
- img-src: Nurodo leidžiamus paveikslėlių šaltinius.
- font-src: Nurodo leidžiamus šriftų šaltinius.
- media-src: Nurodo leidžiamus garso ir vaizdo įrašų šaltinius.
- object-src: Nurodo leidžiamus įskiepių, tokių kaip Flash, šaltinius. (Paprastai geriausia vengti leisti įskiepius, jei įmanoma).
- frame-src: Nurodo leidžiamus rėmelių (iframes) šaltinius.
- connect-src: Nurodo leidžiamus tinklo užklausų (AJAX, WebSockets) šaltinius.
- base-uri: Apriboja URL, kurie gali būti naudojami
<base>elemente. - form-action: Apriboja URL, į kuriuos gali būti siunčiamos formos.
- frame-ancestors: Nurodo galiojančius tėvinius elementus, kurie gali įterpti puslapį naudojant
<frame>,<iframe>,<object>,<embed>arba<applet>. Ši direktyva suteikia apsaugą nuo Clickjacking. - upgrade-insecure-requests: Nurodo vartotojo agentams traktuoti visus svetainės nesaugius URL (įkeltus per HTTP) taip, lyg jie būtų pakeisti saugiais URL (įkeltais per HTTPS). Ši direktyva skirta svetainėms, kurios pereina nuo HTTP prie HTTPS.
- report-uri: Nurodo URL, į kurį naršyklė turėtų siųsti ataskaitas apie CSP pažeidimus. Pasenusi, pirmenybė teikiama `report-to`.
- report-to: Nurodo grupės pavadinimą, apibrėžtą `Report-To` antraštėje. Tai leidžia smulkiau kontroliuoti ataskaitų teikimą, įskaitant kelių ataskaitų teikimo galinių punktų nurodymą.
CSP šaltinio reikšmės
Šaltinio reikšmės apibrėžia šaltinius, iš kurių leidžiama įkelti resursus. Kai kurios dažnos šaltinio reikšmės:
- *: Leidžia turinį iš bet kurio šaltinio (Venkite naudoti produkcinėje aplinkoje!).
- 'self': Leidžia turinį iš to paties šaltinio (schemos, pagrindinio kompiuterio ir prievado) kaip ir saugomas dokumentas.
- 'none': Neleidžia turinio iš jokio šaltinio.
- 'unsafe-inline': Leidžia naudoti įterptinį JavaScript ir CSS (Venkite naudoti produkcinėje aplinkoje!).
- 'unsafe-eval': Leidžia naudoti dinaminį kodo vertinimą (pvz.,
eval(),Function()) (Venkite naudoti produkcinėje aplinkoje!). - 'strict-dynamic': Nurodo, kad pasitikėjimas, aiškiai suteiktas scenarijui, esančiam žymėjime, pridedant prie jo nonce arba maišos funkciją, turi būti perduotas visiems scenarijams, kuriuos įkelia tas protėvis.
- 'unsafe-hashes': Leidžia konkrečius įterptinius įvykių tvarkytuvus. Paprastai tai nerekomenduojama dėl sudėtingumo ir ribotos naudos.
- data:: Leidžia įkelti resursus iš duomenų URL (pvz., įterptų paveikslėlių). Naudokite atsargiai.
- mediastream:: Leidžia naudoti `mediastream:` URI kaip medijos šaltinį.
- blob:: Leidžia naudoti `blob:` URI kaip medijos šaltinį.
- filesystem:: Leidžia įkelti resursus iš failų sistemos.
- https://example.com: Leidžia turinį iš konkretaus domeno ir prievado.
- *.example.com: Leidžia turinį iš bet kurio example.com subdomeno.
- nonce-{random-value}: Leidžia scenarijus ar stilius su atitinkamu nonce atributu. Tam reikia serverio pusėje generuoti atsitiktinę nonce reikšmę kiekvienai užklausai.
- sha256-{hash-value}: Leidžia scenarijus ar stilius su atitinkama SHA256, SHA384 arba SHA512 maišos funkcija.
CSP režimai: priverstinis ir tik ataskaitų teikimo
CSP gali būti įdiegta dviem režimais:
- Priverstinis režimas: Šiame režime naršyklė blokuoja visus resursus, kurie pažeidžia CSP. Tai yra rekomenduojamas režimas produkcinėms aplinkoms. CSP siunčiama naudojant `Content-Security-Policy` antraštę.
- Tik ataskaitų teikimo režimas: Šiame režime naršyklė praneša apie CSP pažeidimus, bet neblokuoja resursų. Tai naudinga testuojant ir vertinant CSP prieš ją įgyvendinant priverstinai. CSP siunčiama naudojant `Content-Security-Policy-Report-Only` antraštę.
CSP įgyvendinimas: žingsnis po žingsnio vadovas
CSP įgyvendinimas gali atrodyti bauginantis, tačiau laikydamiesi struktūrizuoto požiūrio, galite efektyviai apsaugoti savo žiniatinklio programą.
1. Pradėkite nuo tik ataskaitų teikimo politikos
Pradėkite įdiegdami CSP tik ataskaitų teikimo režimu. Tai leidžia stebėti pažeidimus, netrikdant jūsų svetainės funkcionalumo. Sukonfigūruokite report-uri arba report-to direktyvą, kad pažeidimų ataskaitos būtų siunčiamos į nurodytą galinį punktą.
Antraštės pavyzdys (tik ataskaitų teikimas):
Content-Security-Policy-Report-Only: default-src 'self'; report-uri /csp-report
2. Analizuokite pažeidimų ataskaitas
Atidžiai analizuokite pažeidimų ataskaitas, kad nustatytumėte, kurie resursai blokuojami ir kodėl. Tai padės jums suprasti jūsų svetainės resursų priklausomybes ir nustatyti galimus saugumo pažeidžiamumus.
Pažeidimų ataskaitos paprastai siunčiamos kaip JSON duomenys į sukonfigūruotą report-uri arba report-to galinį punktą. Šiose ataskaitose pateikiama informacija apie pažeidimą, pvz., blokuotas URI, pažeista direktyva ir dokumento URI.
3. Patikslinkite CSP politiką
Remdamiesi pažeidimų ataskaitomis, patikslinkite savo CSP politiką, kad leistumėte teisėtus resursus, išlaikydami tvirtą saugumo poziciją. Pridėkite konkrečias šaltinio reikšmes blokuojamiems resursams. Apsvarstykite galimybę naudoti nonce arba maišos funkcijas įterptiniams scenarijams ir stiliams, kad išvengtumėte 'unsafe-inline' naudojimo.
4. Pereikite prie priverstinio režimo
Kai būsite tikri, kad jūsų CSP politika neblokuoja teisėtų resursų, pereikite prie priverstinio režimo. Tai blokuos visus likusius pažeidimus ir suteiks tvirtą apsaugos lygį nuo XSS atakų.
Antraštės pavyzdys (priverstinis):
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. Stebėkite ir palaikykite CSP politiką
CSP nėra „nustatyk ir pamiršk“ sprendimas. Būtina nuolat stebėti savo CSP politiką ir ją atnaujinti, kai jūsų svetainė vystosi ir atsiranda naujų saugumo grėsmių. Reguliariai peržiūrėkite pažeidimų ataskaitas ir prireikus koreguokite politiką.
Praktiniai CSP pavyzdžiai
Pažvelkime į keletą praktinių CSP pavyzdžių skirtingiems scenarijams:
1 pavyzdys: Pagrindinė CSP paprastai svetainei
Ši CSP leidžia turinį iš to paties šaltinio ir leidžia paveikslėlius iš bet kurio šaltinio.
Content-Security-Policy: default-src 'self'; img-src *
2 pavyzdys: CSP su konkrečiais scenarijų ir stilių šaltiniais
Ši CSP leidžia scenarijus iš to paties šaltinio ir iš konkretaus CDN, o stilius - iš to paties šaltinio ir įterptinius stilius.
Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.example.com; style-src 'self' 'unsafe-inline'
3 pavyzdys: CSP su nonce įterptiniams scenarijams
Ši CSP reikalauja unikalaus nonce kiekvienam įterptiniam scenarijui.
Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-r4nd0mn0nc3'
HTML:
<script nonce="r4nd0mn0nc3">console.log('Hello, world!');</script>
Svarbu: Nonce reikšmė turi būti dinamiškai generuojama serveryje kiekvienai užklausai. Tai neleidžia užpuolikams pakartotinai naudoti nonce.
4 pavyzdys: CSP, ribojanti frame-ancestors, siekiant išvengti Clickjacking
Ši CSP neleidžia puslapio įterpti į iframe jokiame domene, išskyrus `https://example.com`.
Content-Security-Policy: frame-ancestors 'self' https://example.com
5 pavyzdys: Griežtesnė CSP, naudojanti 'strict-dynamic' ir atsarginį variantą 'self'
Ši CSP naudoja `strict-dynamic` šiuolaikinėms naršyklėms, tuo pačiu palaikydama senesnes naršykles, kurios to nepalaiko. Ji taip pat apima `report-uri` pažeidimų stebėsenai.
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
Nepamirškite pakeisti `{random-nonce}` dinamiškai generuojama nonce reikšme serverio pusėje.
CSP ir vieno puslapio programos (SPA)
CSP įgyvendinimas SPA gali būti sudėtingas dėl šių programų dinamiškumo. SPA dažnai smarkiai priklauso nuo JavaScript, kad generuotų ir manipuliuotų DOM, o tai gali sukelti CSP pažeidimus, jei nebus atidžiai tvarkoma.
Štai keletas patarimų, kaip įgyvendinti CSP SPA:
- Venkite
'unsafe-inline'ir'unsafe-eval': Šių direktyvų reikėtų vengti, kai tik įmanoma, SPA. Jos žymiai susilpnina jūsų programos saugumą. - Naudokite Nonce arba maišos funkcijas: Naudokite nonce arba maišos funkcijas įterptiniams scenarijams ir stiliams. Tai yra rekomenduojamas metodas SPA.
- Apsvarstykite Trusted Types: Trusted Types yra naršyklės API, padedanti išvengti DOM pagrįstų XSS pažeidžiamumų. Ji gali būti naudojama kartu su CSP siekiant dar labiau padidinti saugumą.
- Naudokite su CSP suderinamą karkasą: Kai kurie frontend karkasai (pvz., React su specifinėmis konfigūracijomis, Angular ir Vue.js) suteikia funkcijų, padedančių lengviau įgyvendinti CSP.
Kitos svarbios frontend saugumo antraštės
Nors CSP yra frontend saugumo pagrindas, kitos antraštės atlieka svarbų vaidmenį kuriant išsamią gynybos strategiją:
Strict-Transport-Security (HSTS)
Strict-Transport-Security (HSTS) antraštė nurodo naršyklei visada naudoti HTTPS jungiantis prie svetainės. Tai apsaugo nuo man-in-the-middle atakų, kurios bando sumažinti ryšio lygį iki HTTP.
Antraštės pavyzdys:
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
max-age: Nurodo trukmę (sekundėmis), kiek laiko naršyklė turėtų prisiminti, kad prie svetainės jungtis galima tik per HTTPS. Produkcinėms aplinkoms rekomenduojama 31536000 sekundžių (1 metų) reikšmė.includeSubDomains: Nurodo, kad HSTS politika taikoma visiems domeno subdomenams.preload: Leidžia domeną įtraukti į HSTS palaikančių domenų sąrašą, kuris yra iš anksto įkeliamas į naršykles. Tam reikia pateikti savo domeną į HSTS išankstinio įkėlimo sąrašą, kurį prižiūri Google.
X-Frame-Options
X-Frame-Options antraštė apsaugo nuo clickjacking atakų, kontroliuodama, ar svetainę galima įterpti į iframe.
Antraštės pavyzdys:
X-Frame-Options: DENY
Galimos reikšmės:
DENY: Neleidžia puslapio rodyti iframe, nepriklausomai nuo šaltinio.SAMEORIGIN: Leidžia puslapį rodyti iframe tik tada, kai iframe šaltinis sutampa su puslapio šaltiniu.ALLOW-FROM uri: Leidžia puslapį rodyti iframe tik tada, kai iframe šaltinis sutampa su nurodytu URI. Pastaba: ši parinktis yra pasenusi ir gali būti nepalaikoma visose naršyklėse.
Pastaba: frame-ancestors direktyva CSP suteikia lankstesnį ir galingesnį būdą kontroliuoti rėmelių naudojimą ir paprastai yra pageidautinesnė nei X-Frame-Options.
X-XSS-Protection
X-XSS-Protection antraštė įjungia naršyklės integruotą XSS filtrą. Nors CSP yra patikimesnis sprendimas siekiant išvengti XSS atakų, ši antraštė gali suteikti papildomą apsaugos lygį, ypač senesnėms naršyklėms, kurios gali nevisiškai palaikyti CSP.
Antraštės pavyzdys:
X-XSS-Protection: 1; mode=block
1: Įjungia XSS filtrą.0: Išjungia XSS filtrą.mode=block: Nurodo naršyklei blokuoti puslapį, jei aptinkama XSS ataka.report=uri: Nurodo URL, į kurį naršyklė turėtų siųsti ataskaitą, jei aptinkama XSS ataka.
Referrer-Policy
Referrer-Policy antraštė kontroliuoja, kiek persiuntimo informacijos siunčiama su užklausomis. Persiuntimo informacija gali būti naudojama vartotojų sekimui tarp svetainių, todėl jos kontrolė gali pagerinti vartotojų privatumą.
Antraštės pavyzdys:
Referrer-Policy: strict-origin-when-cross-origin
Kai kurios dažnos reikšmės:
no-referrer: Niekada nesiųsti Referer antraštės.no-referrer-when-downgrade: Nesiųsti Referer antraštės į šaltinius be TLS (HTTPS).origin: Siųsti tik šaltinį (schemą, pagrindinį kompiuterį ir prievadą) Referer antraštėje.origin-when-cross-origin: Siųsti šaltinį tarpšaltininėms užklausoms ir pilną URL tos pačios kilmės užklausoms.same-origin: Siųsti Referer antraštę tos pačios kilmės užklausoms, bet ne tarpšaltininėms užklausoms.strict-origin: Siųsti tik šaltinį, kai protokolo saugumo lygis išlieka tas pats (HTTPS į HTTPS), bet nesiųsti antraštės į mažiau saugų tikslą (HTTPS į HTTP).strict-origin-when-cross-origin: Siųsti šaltinį vykdant tos pačios kilmės užklausą. Tarpšaltininėms užklausoms siųsti šaltinį tik tada, kai protokolo saugumo lygis išlieka tas pats (HTTPS į HTTPS), bet nesiųsti antraštės į mažiau saugų tikslą (HTTPS į HTTP).unsafe-url: Siųsti pilną URL Referer antraštėje, nepriklausomai nuo šaltinio. Naudokite itin atsargiai, nes tai gali atskleisti jautrią informaciją.
Permissions-Policy (anksčiau Feature-Policy)
Permissions-Policy antraštė (anksčiau žinoma kaip Feature-Policy) leidžia kūrėjams pasirinktinai įjungti ir išjungti naršyklės funkcijas ir API. Tai gali padėti sumažinti jūsų programos atakos paviršių ir pagerinti vartotojų privatumą.
Antraštės pavyzdys:
Permissions-Policy: geolocation=()
Šis pavyzdys išjungia geografinės vietos nustatymo API svetainei.
Kitos funkcijos, kurias galima valdyti su Permissions-Policy, apima:
cameramicrophonegeolocationaccelerometergyroscopemagnetometerusbmidipaymentfullscreen
Saugumo antraščių nustatymas skirtingose platformose
Saugumo antraščių nustatymo metodas priklauso nuo jūsų naudojamo žiniatinklio serverio ar platformos. Štai keletas dažnų pavyzdžių:
Apache
Saugumo antraštes Apache galite nustatyti pridėdami jas į .htaccess failą arba serverio konfigūracijos failą (httpd.conf).
Pavyzdinė .htaccess konfigūracija:
<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
Saugumo antraštes Nginx galite nustatyti pridėdami jas į serverio bloką Nginx konfigūracijos faile (nginx.conf).
Pavyzdinė Nginx konfigūracija:
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)
Saugumo antraštes Node.js galite nustatyti naudodami tarpinę programinę įrangą, pvz., Helmet.
Pavyzdys naudojant Helmet:
const express = require('express');
const helmet = require('helmet');
const app = express();
app.use(helmet());
// Pritaikykite CSP, jei reikia
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('Hello World!');
});
app.listen(3000, () => {
console.log('Server listening on port 3000');
});
Cloudflare
Cloudflare leidžia nustatyti saugumo antraštes naudojant jų puslapio taisykles (Page Rules) arba transformavimo taisykles (Transform Rules).
Jūsų saugumo antraščių testavimas
Įdiegus saugumo antraštes, labai svarbu jas išbandyti, siekiant užtikrinti, kad jos veikia teisingai. Keletas internetinių įrankių gali padėti išanalizuoti jūsų svetainės saugumo antraštes:
- SecurityHeaders.com: Paprastas ir efektyvus įrankis saugumo antraštėms analizuoti.
- Mozilla Observatory: Išsamus įrankis svetainės saugumui, įskaitant saugumo antraštes, testuoti.
- WebPageTest.org: Leidžia peržiūrėti HTTP antraštes krioklio diagramoje.
Išvada
Frontend saugumo antraštės, ypač turinio saugumo politika (CSP), yra būtinos norint apsaugoti žiniatinklio programas nuo įvairių atakų ir padidinti vartotojų saugumą. Atidžiai įgyvendindami ir prižiūrėdami šias antraštes, galite žymiai sumažinti XSS, clickjacking ir kitų saugumo pažeidžiamumų riziką. Nepamirškite pradėti nuo tik ataskaitų teikimo politikos, analizuoti pažeidimų ataskaitas, patikslinti politiką ir tada pereiti prie priverstinio režimo. Reguliariai stebėkite ir atnaujinkite savo saugumo antraštes, kad jūsų svetainė išliktų saugi jai vystantis ir atsirandant naujoms grėsmėms.
Laikydamiesi aktyvaus požiūrio į frontend saugumą, galite sukurti saugesnes ir patikimesnes žiniatinklio programas, kurios apsaugo jūsų vartotojus ir jūsų verslą.