Sužinokite, kaip turinio saugumo politika (CSP) veiksmingai mažina tarpvietinio scenarijų (XSS) atakas, didindama žiniatinklio saugumą visame pasaulyje.
Turinio saugumo politika (CSP): išsamus vadovas, kaip išvengti XSS atakų
Šiuolaikiniame skaitmeniniame pasaulyje žiniatinklio saugumas yra svarbiausias dalykas. Tarpvietinio scenarijų (angl. Cross-Site Scripting, XSS) atakos išlieka paplitusia ir pavojinga grėsme žiniatinklio programoms visame pasaulyje. Turinio saugumo politika (angl. Content Security Policy, CSP) yra galinga HTTP atsakymo antraštė, kuri suteikia papildomą saugumo lygį, padedantį sumažinti XSS pažeidžiamumų riziką. Šis vadovas siūlo išsamią CSP apžvalgą, jos įgyvendinimą ir geriausias praktikas, skirtas apsaugoti jūsų žiniatinklio programas nuo XSS atakų.
Kas yra tarpvietinis scenarijus (XSS)?
Tarpvietinis scenarijus (XSS) yra įterpimo atakos tipas, kai kenkėjiški scenarijai įterpiami į kitaip nekenksmingas ir patikimas svetaines. XSS atakos įvyksta, kai užpuolikas naudoja žiniatinklio programą, kad išsiųstų kenkėjišką kodą, dažniausiai naršyklės vykdomo scenarijaus pavidalu, kitam galutiniam vartotojui. Trūkumai, leidžiantys šioms atakoms pavykti, yra gana paplitę ir atsiranda visur, kur žiniatinklio programa naudoja vartotojo įvestį savo generuojamame išvesties kode, jos netikrindama ar nekoduodama.
Yra trys pagrindiniai XSS atakų tipai:
- Išsaugota (nuolatinė) XSS: Kenkėjiškas scenarijus yra nuolat saugomas tiksliniame serveryje (pvz., duomenų bazėje, pranešimų forume, lankytojų žurnale, komentarų lauke ir kt.). Kai vartotojas apsilanko paveiktame puslapyje, išsaugotas scenarijus yra vykdomas.
- Atspindėta (nenuolatinė) XSS: Kenkėjiškas scenarijus atspindimas nuo žiniatinklio serverio, pavyzdžiui, klaidos pranešime, paieškos rezultate ar bet kuriame kitame atsakyme, kuriame yra dalis ar visa įvestis, išsiųsta serveriui kaip užklausos dalis. Vartotojas turi būti apgautas, kad paspaustų kenkėjišką nuorodą arba pateiktų formą su kenkėjišku scenarijumi.
- DOM pagrįsta XSS: Pažeidžiamumas egzistuoja pačiame kliento pusės kode. Kenkėjiškas scenarijus vykdomas, nes naršyklės DOM aplinka yra manipuliuojama, kad įtrauktų užpuoliko scenarijų.
XSS atakos gali turėti rimtų pasekmių, įskaitant:
- Vartotojo prisijungimo duomenų (slapukų, seanso žetonų) vagystę.
- Svetainių išdarkymą.
- Vartotojų nukreipimą į kenkėjiškas svetaines.
- Kenkėjiškos programinės įrangos diegimą.
- Neteisėtą prieigą prie jautrių duomenų.
Kas yra turinio saugumo politika (CSP)?
Turinio saugumo politika (CSP) yra papildomas saugumo lygmuo, padedantis aptikti ir sušvelninti tam tikrų tipų atakas, įskaitant tarpvietinio scenarijų (XSS) ir duomenų įterpimo atakas. CSP yra įgyvendinama naudojant HTTP atsakymo antraštę, kuri leidžia jums kontroliuoti išteklius (pvz., scenarijus, stilių lenteles, paveikslėlius, šriftus, rėmelius), kuriuos naršyklė gali įkelti tam tikram puslapiui. Apibrėždami griežtą CSP, galite žymiai sumažinti savo žiniatinklio programos atakos paviršių ir apsunkinti užpuolikams kenkėjiško kodo įterpimą.
CSP veikia apibrėždama baltąjį sąrašą šaltinių, iš kurių naršyklei leidžiama įkelti išteklius. Bet koks išteklius, įkeltas iš šaltinio, kuris nėra aiškiai leidžiamas CSP, bus užblokuotas naršyklės. Tai neleidžia vykdyti neautorizuotų scenarijų ir sumažina XSS atakų riziką.
Kaip veikia CSP: direktyvos ir šaltiniai
CSP konfigūruojama naudojant direktyvų seriją, kurių kiekviena nurodo politiką konkretaus tipo ištekliui. Kiekviena direktyva susideda iš pavadinimo, po kurio eina leidžiamų šaltinių sąrašas. Štai keletas dažniausiai naudojamų CSP direktyvų:
- `default-src`: Nurodo numatytąją politiką išteklių gavimui, jei nėra kitų konkrečių išteklių direktyvų.
- `script-src`: Nurodo leidžiamus JavaScript kodo šaltinius.
- `style-src`: Nurodo leidžiamus stilių lentelių (CSS) šaltinius.
- `img-src`: Nurodo leidžiamus paveikslėlių šaltinius.
- `font-src`: Nurodo leidžiamus šriftų šaltinius.
- `connect-src`: Nurodo leidžiamus šaltinius tinklo užklausoms (pvz., AJAX, WebSockets).
- `media-src`: Nurodo leidžiamus šaltinius vaizdo ir garso ištekliams įkelti.
- `object-src`: Nurodo leidžiamus šaltinius įskiepiams, tokiems kaip Flash.
- `frame-src`: Nurodo leidžiamus šaltinius rėmelių (iframes) įterpimui.
- `base-uri`: Apriboja URL adresus, kurie gali būti naudojami dokumento <base> elemente.
- `form-action`: Apriboja URL adresus, į kuriuos gali būti siunčiamos formos.
- `upgrade-insecure-requests`: Nurodo naršyklėms automatiškai atnaujinti nesaugias (HTTP) užklausas į saugias (HTTPS) užklausas.
- `block-all-mixed-content`: Neleidžia naršyklei įkelti jokių išteklių naudojant HTTP, kai puslapis įkeltas per HTTPS.
- `report-uri`: Nurodo URL, į kurį naršyklė turėtų siųsti CSP pažeidimų ataskaitas. Pasenusi, rekomenduojama naudoti `report-to`.
- `report-to`: Nurodo pavadintą galinį tašką, į kurį naršyklė turėtų siųsti CSP pažeidimų ataskaitas.
Dažniausiai naudojamos šaltinių reikšmės:
- `*`: Leidžia išteklius iš bet kurio šaltinio (nerekomenduojama gamybinėms aplinkoms).
- `'self'`: Leidžia išteklius iš to paties šaltinio (schemos, pagrindinio kompiuterio ir prievado) kaip ir apsaugotas dokumentas.
- `'none'`: Neleidžia įkelti išteklių iš jokio šaltinio.
- `data:`: Leidžia įkelti išteklius per `data:` schemą (pvz., įterptus paveikslėlius).
- `'unsafe-inline'`: Leidžia naudoti įterptąjį JavaScript ir CSS (griežtai nerekomenduojama).
- `'unsafe-eval'`: Leidžia naudoti `eval()` ir panašias funkcijas (griežtai nerekomenduojama).
- `'strict-dynamic'`: Nurodo, kad pasitikėjimas, aiškiai suteiktas scenarijui, esančiam žymėjime, pridedant prie jo nonce arba maišos (hash) reikšmę, turi būti perduodamas visiems scenarijams, kuriuos įkelia tas pagrindinis scenarijus.
- `'nonce-
'` : Leidžia scenarijus ar stilius su atitinkamu nonce atributu. - `'sha256-
'`, `'sha384- : Leidžia scenarijus ar stilius su atitinkama SHA maišos reikšme.'`, `'sha512- '` - `https://example.com`: Leidžia išteklius iš konkretaus domeno.
CSP įgyvendinimas
CSP galima įgyvendinti dviem pagrindiniais būdais:
- HTTP antraštė: Pageidautinas metodas yra sukonfigūruoti savo žiniatinklio serverį siųsti `Content-Security-Policy` HTTP atsakymo antraštę. Tai leidžia jums apibrėžti CSP kiekvienam puslapiui ar ištekliui jūsų svetainėje.
- <meta> žyma: CSP taip pat galima apibrėžti naudojant <meta> žymą jūsų HTML dokumento <head> skiltyje. Tačiau šis metodas yra mažiau lankstus ir turi apribojimų, palyginti su HTTP antraštės naudojimu. Pavyzdžiui, `frame-ancestors`, `sandbox` ir `report-uri` direktyvos negali būti naudojamos HTML meta žymose.
Naudojant HTTP antraštę
Norėdami įgyvendinti CSP naudojant HTTP antraštę, turite sukonfigūruoti savo žiniatinklio serverį, kad jis įtrauktų `Content-Security-Policy` antraštę į savo atsakymus. Konkretūs konfigūracijos veiksmai priklausys nuo jūsų naudojamo žiniatinklio serverio.
Štai pavyzdžiai populiariausiems žiniatinklio serveriams:
- Apache: Pridėkite šią eilutę į savo `.htaccess` failą arba virtualaus pagrindinio kompiuterio konfigūraciją:
Header set Content-Security-Policy "default-src 'self'; script-src 'self' https://example.com; style-src 'self' https://example.com; img-src 'self' data:;"
add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://example.com; style-src 'self' https://example.com; img-src 'self' data:;";
app.use(function(req, res, next) {
res.setHeader("Content-Security-Policy", "default-src 'self'; script-src 'self' https://example.com; style-src 'self' https://example.com; img-src 'self' data:;");
next();
});
Naudojant <meta> žymą
Norėdami įgyvendinti CSP naudojant <meta> žymą, pridėkite šią žymą į savo HTML dokumento <head> skiltį:
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' https://example.com; style-src 'self' https://example.com; img-src 'self' data:;">
Svarbūs aspektai:
- `http-equiv` atributas turi būti nustatytas į "Content-Security-Policy".
- `content` atributas apima CSP direktyvas.
- Nepamirškite anksčiau minėtų <meta> žymų naudojimo apribojimų.
CSP pavyzdžiai
Štai keletas CSP pavyzdžių su paaiškinimais:
- Pagrindinė CSP:
- Scenarijų leidimas iš konkretaus domeno:
- Stilių leidimas iš CDN:
- Paveikslėlių leidimas iš bet kurio šaltinio:
- CSP pažeidimų ataskaitų siuntimas:
- `report-to` ir `report-uri` naudojimas kartu suderinamumui užtikrinti:
- Nonce naudojimas įterptiesiems scenarijams:
Content-Security-Policy: default-src 'self';
Ši politika leidžia išteklius tik iš to paties šaltinio.
Content-Security-Policy: default-src 'self'; script-src 'self' https://example.com;
Ši politika leidžia išteklius iš to paties šaltinio ir scenarijus iš `https://example.com`.
Content-Security-Policy: default-src 'self'; style-src 'self' https://cdn.example.com;
Ši politika leidžia išteklius iš to paties šaltinio ir stilius iš `https://cdn.example.com`.
Content-Security-Policy: default-src 'self'; img-src *;
Ši politika leidžia išteklius iš to paties šaltinio ir paveikslėlius iš bet kurio šaltinio (nerekomenduojama gamybinėms aplinkoms).
Content-Security-Policy: default-src 'self'; report-uri /csp-report-endpoint;
Ši politika leidžia išteklius iš to paties šaltinio ir siunčia pažeidimų ataskaitas į `/csp-report-endpoint`. Rekomenduojama naudoti `report-to` vietoj `report-uri`.
Content-Security-Policy: default-src 'self'; report-uri /csp-report-endpoint; report-to csp-endpoint;
Content-Security-Policy-Report-Only: default-src 'self'; report-uri /csp-report-endpoint; report-to csp-endpoint;
Report-To: {"group":"csp-endpoint","max_age":10886400,"endpoints":[{"url":"/csp-report-endpoint"}]}
Šis pavyzdys demonstruoja, kaip nustatyti ir `report-uri` (senesnėms naršyklėms), ir `report-to` galinį tašką, kartu konfigūruojant pačią `Report-To` antraštę. Įsitikinkite, kad jūsų serveris tinkamai apdoroja `Report-To` antraštę, teisingai nustatydamas `group`, `max_age` ir `endpoints`.
Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-rAnd0mN0nc3Str1nG';
Ši politika leidžia išteklius iš to paties šaltinio ir įterptuosius scenarijus su atitinkamu nonce atributu.
<script nonce="rAnd0mN0nc3Str1nG">
// Jūsų įterptojo scenarijaus kodas čia
</script>
CSP tik ataskaitų teikimo režimu
CSP gali būti įgyvendinta dviem režimais:
- Priverstinis režimas: Naršyklė blokuoja išteklius, kurie pažeidžia CSP.
- Tik ataskaitų teikimo režimas: Naršyklė praneša apie CSP pažeidimus nurodytam galiniam taškui, neblokuodama jokių išteklių.
Tik ataskaitų teikimo režimas yra naudingas testuojant ir tobulinant CSP prieš ją priverstinai įgyvendinant. Norėdami įjungti tik ataskaitų teikimo režimą, naudokite `Content-Security-Policy-Report-Only` HTTP antraštę vietoj `Content-Security-Policy` antraštės.
Pavyzdys:
Content-Security-Policy-Report-Only: default-src 'self'; report-uri /csp-report-endpoint;
Ši konfigūracija siųs ataskaitas į `/csp-report-endpoint`, neblokuodama jokių išteklių.
Geriausios CSP įgyvendinimo praktikos
Štai keletas geriausių praktikų efektyviam CSP įgyvendinimui:
- Pradėkite nuo griežtos politikos: Pradėkite nuo ribojančios politikos, kuri leidžia išteklius tik iš to paties šaltinio, ir palaipsniui ją švelninkite, jei reikia.
- Naudokite Nonce arba maišos reikšmes įterptiesiems scenarijams ir stiliams: Venkite naudoti `'unsafe-inline'` ir naudokite nonce arba maišos reikšmes, kad leistumėte konkrečius įterptuosius scenarijus ir stilius.
- Venkite `'unsafe-eval'`: Jei įmanoma, venkite naudoti `'unsafe-eval'`, nes tai gali sukelti saugumo rizikų. Apsvarstykite alternatyvius dinaminio kodo vykdymo būdus.
- Naudokite HTTPS: Užtikrinkite, kad visi ištekliai būtų įkeliami per HTTPS, kad išvengtumėte „žmogus viduryje“ (man-in-the-middle) atakų. Naudokite `upgrade-insecure-requests` direktyvą, kad automatiškai atnaujintumėte nesaugias užklausas.
- Stebėkite CSP pažeidimus: Nustatykite ataskaitų galinį tašką, kad stebėtumėte CSP pažeidimus ir nustatytumėte galimas saugumo problemas.
- Išsamiai testuokite savo CSP: Išbandykite savo CSP skirtingose naršyklėse ir aplinkose, kad įsitikintumėte, jog ji veikia taip, kaip tikėtasi.
- Iteruokite ir tobulinkite: CSP įgyvendinimas yra iteracinis procesas. Nuolat stebėkite ir tobulinkite savo CSP, kai jūsų programa vystosi.
- Apsvarstykite `strict-dynamic` direktyvą: Naudokite `strict-dynamic`, kad sumažintumėte savo CSP sudėtingumą, perduodami pasitikėjimą scenarijams, kuriuos įkelia patikimi scenarijai.
Įrankiai CSP
Keletas įrankių gali padėti jums generuoti, testuoti ir stebėti CSP:
- CSP generatoriai: Internetiniai įrankiai, kurie generuoja CSP direktyvas pagal jūsų svetainės išteklius.
- Naršyklės kūrėjų įrankiai: Dauguma modernių naršyklių teikia kūrėjų įrankius, kurie gali padėti analizuoti CSP pažeidimus.
- CSP stebėjimo paslaugos: Paslaugos, kurios renka ir analizuoja CSP pažeidimų ataskaitas.
CSP ir karkasai/bibliotekos
Naudojant karkasus ir bibliotekas, svarbu teisingai sukonfigūruoti CSP, kad būtų užtikrintas suderinamumas ir išvengta saugumo problemų. Štai keletas svarstymų:
- JavaScript karkasai (pvz., React, Angular, Vue.js): Šie karkasai dažnai naudoja įterptuosius stilius arba dinaminį kodo generavimą, kas gali reikalauti specialių CSP konfigūracijų (pvz., nonce, maišos reikšmių, `'unsafe-eval'`).
- CSS karkasai (pvz., Bootstrap, Tailwind CSS): Šie karkasai gali naudoti įterptuosius stilius arba išorines stilių lenteles, kurias reikia leisti jūsų CSP.
- Trečiųjų šalių bibliotekos: Užtikrinkite, kad bet kokios trečiųjų šalių bibliotekos, kurias naudojate, būtų suderinamos su jūsų CSP ir neįvestų saugumo pažeidžiamumų.
CSP ir CDN (turinio pristatymo tinklai)
CDN dažnai naudojami statiniams ištekliams, tokiems kaip JavaScript failai, CSS stilių lentelės ir paveikslėliai, talpinti. Norėdami leisti išteklius iš CDN savo CSP, turite aiškiai įtraukti CDN domenus į baltąjį sąrašą.
Pavyzdys:
Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.jsdelivr.net; style-src 'self' https://cdnjs.cloudflare.com;
Ši politika leidžia scenarijus iš jsDelivr ir stilius iš Cloudflare cdnjs.
Dažniausios CSP klaidos, kurių reikia vengti
Štai keletas dažniausių CSP klaidų, kurių reikia vengti:
- `*` naudojimas kaip šaltinis: Leidimas ištekliams iš bet kurio šaltinio gali panaikinti CSP privalumus.
- `'unsafe-inline'` ir `'unsafe-eval'` naudojimas be pagrindo: Šios direktyvos gali sukelti saugumo rizikų ir jų reikėtų vengti, jei įmanoma.
- CSP pažeidimų nestebėjimas: Nesugebėjimas stebėti CSP pažeidimų gali neleisti jums nustatyti ir spręsti saugumo problemų.
- Nepakankamas CSP testavimas: Nepakankamas testavimas gali sukelti netikėtą elgseną ir saugumo pažeidžiamumus.
- Neteisingas Nonce ir maišos reikšmių konfigūravimas: Neteisingai sukonfigūruoti nonce ir maišos reikšmės gali neleisti įkelti teisėtų scenarijų ir stilių.
Pažangios CSP koncepcijos
Be pagrindų, keletas pažangių CSP koncepcijų gali dar labiau pagerinti jūsų žiniatinklio saugumą:
- `frame-ancestors` direktyva: Nurodo leidžiamus tėvinius elementus, kurie gali įterpti rėmelį (iframe) jūsų puslapyje. Apsaugo nuo „clickjacking“ atakų.
- `sandbox` direktyva: Įjungia „smėlio dėžę“ prašomam ištekliui, taikydama apribojimus jo galimybėms (pvz., neleidžiant scenarijų vykdymo, formų siuntimo).
- `require-sri-for` direktyva: Reikalauja subresurso vientisumo (angl. Subresource Integrity, SRI) scenarijams ar stiliams, įkeltiems iš išorinių šaltinių. SRI užtikrina, kad failai nebuvo pakeisti.
- Trusted Types API: Padeda išvengti DOM pagrįsto XSS, priverstinai taikant tipų saugumą DOM „kriauklėms“.
CSP ateitis
CSP nuolat tobulėja, kad atremtų naujus saugumo iššūkius. Ateities pokyčiai gali apimti:
- Patobulintas naršyklių palaikymas: Nuolatiniai CSP funkcijų naršyklių palaikymo patobulinimai.
- Naujos direktyvos ir funkcijos: Naujų direktyvų ir funkcijų įvedimas, skirtas spręsti kylančias saugumo grėsmes.
- Integracija su saugumo įrankiais: Gilesnė integracija su saugumo įrankiais ir platformomis, siekiant automatizuoti CSP valdymą ir stebėjimą.
Išvada
Turinio saugumo politika (CSP) yra galingas įrankis, skirtas sušvelninti XSS atakas ir pagerinti žiniatinklio saugumą. Apibrėždami griežtą CSP, galite žymiai sumažinti savo žiniatinklio programos atakos paviršių ir apsaugoti savo vartotojus nuo kenkėjiško kodo. Efektyvus CSP įgyvendinimas reikalauja kruopštaus planavimo, išsamaus testavimo ir nuolatinio stebėjimo. Laikydamiesi šiame vadove pateiktų geriausių praktikų, galite panaudoti CSP, kad pagerintumėte savo žiniatinklio programų saugumo būklę ir apsaugotumėte savo buvimą internete pasaulinėje skaitmeninėje ekosistemoje.
Nepamirškite reguliariai peržiūrėti ir atnaujinti savo CSP, kad prisitaikytumėte prie besikeičiančių saugumo grėsmių ir užtikrintumėte, jog jūsų žiniatinklio programos išliktų apsaugotos.