Õppige rakendama JavaScripti sisuturbe poliitikat (CSP), et tõsta oma veebirakenduse turvalisust rünnakute nagu XSS ja andmesisestuse vastu.
Oma veebirakenduste kindlustamine: sĂĽgav sissevaade JavaScripti sisuturbe poliitikasse (CSP)
Tänapäeva omavahel ühendatud digitaalses maastikus on veebirakenduste turvalisus ülimalt oluline. Pahatahtlikud osapooled otsivad pidevalt haavatavusi, mida ära kasutada, ning edukas rünnak võib viia andmeleketeni, rahaliste kaotusteni ja tõsise mainekahjuni. Üks tõhusamaid kaitsemeetmeid levinud veebiohtude, nagu saidiülene skriptimine (XSS) ja andmesisestus, vastu on robustsete turvapäiste rakendamine. Nende seas paistab eriti silma sisuturbe poliitika (CSP) kui võimas tööriist, eriti JavaScripti käivitamisega tegelemisel.
See põhjalik juhend tutvustab teile JavaScripti sisuturbe poliitika rakendamise ja haldamise keerukust, pakkudes praktilisi teadmisi ja näiteid globaalsele publikule. Olenemata sellest, kas olete kogenud arendaja või alles alustate oma teekonda veebiturvalisuse vallas, on CSP mõistmine oluline samm vastupidavamate veebirakenduste loomise suunas.
Mis on sisuturbe poliitika (CSP)?
Sisuturbe poliitika (CSP) on täiendav turvakiht, mis aitab tuvastada ja leevendada teatud tüüpi rünnakuid, sealhulgas saidiülest skriptimist (XSS) ja andmesisestusrünnakuid. See on HTTP vastuse päis, mis ütleb brauserile, milliseid dünaamilisi ressursse (skripte, stiililehti, pilte jne) on antud lehel lubatud laadida. Lubatud allikate valge nimekirja määramisega vähendab CSP oluliselt teie veebirakenduse ründepinda.
Mõelge CSP-le kui rangele väravavahile oma veebilehel. Selle asemel, et passiivselt lubada igal skriptil käivituda, määratlete te selgesõnaliselt, kust skriptid võivad pärineda. Kui skript proovib laadida volitamata allikast, blokeerib brauser selle, vältides potentsiaalset pahatahtlikku käivitamist.
Miks on CSP JavaScripti turvalisuse jaoks ĂĽlioluline?
JavaScript, olles interaktiivsete ja dünaamiliste veebikogemuste selgroog, on ka ründajate peamine sihtmärk. Pahatahtlik JavaScript võib:
- Varastada tundlikku kasutajateavet (nt küpsised, seansimärgid, isikuandmed).
- Suunata kasutajaid andmepĂĽĂĽgisaitidele.
- Teha kasutaja nimel toiminguid ilma nende nõusolekuta.
- Süübida soovimatut sisu või reklaame.
- Kaaperdada kasutajate brausereid krĂĽptovaluuta kaevandamiseks.
Eelkõige XSS-rünnakud tuginevad sageli pahatahtliku JavaScripti süstimisele veebilehtedele. CSP võitleb sellega otse, kontrollides, kust JavaScripti saab käivitada. Vaikimisi lubavad brauserid tekstisiseseid skripte ja dünaamiliselt hinnatavat JavaScripti (nagu `eval()`). Need on XSS-i jaoks tavalised vektorid. CSP võimaldab teil need ohtlikud funktsioonid keelata ja kehtestada rangemad kontrollid.
Kuidas CSP töötab: The Content-Security-Policy
päis
CSP rakendatakse, saates oma veebiserverist brauserile Content-Security-Policy
HTTP-päise. See päis sisaldab direktiivide kogumit, mis määratlevad turvapoliitika. Iga direktiiv kontrollib teatud tüüpi ressursi laadimist või käivitamist.
Siin on CSP päise põhistruktuur:
Content-Security-Policy: directive1 value1 value2; directive2 value3; ...
Vaatame lähemalt JavaScripti turvalisuse seisukohalt olulisi direktiive:
Peamised direktiivid JavaScripti turvalisuse jaoks
script-src
See on vaieldamatult kõige kriitilisem direktiiv JavaScripti turvalisuse jaoks. See määratleb JavaScripti lubatud allikad. Vaikimisi, kui script-src
pole määratletud, langevad brauserid tagasi default-src
direktiivile. Kui kumbki pole määratletud, on kõik allikad lubatud, mis on äärmiselt ebaturvaline.
Näited:
script-src 'self';
: Lubab skripte laadida ainult dokumendiga samast päritolust.script-src 'self' https://cdn.example.com;
: Lubab skripte samast päritolust ja CDN-ist aadressilhttps://cdn.example.com
.script-src 'self' 'unsafe-inline' 'unsafe-eval';
: Kasutage äärmise ettevaatusega! See lubab tekstisiseseid skripte ja `eval()`-i, kuid nõrgendab oluliselt turvalisust. Ideaalis tuleks vältida'unsafe-inline'
ja'unsafe-eval'
kasutamist.script-src 'self' *.google.com;
: Lubab skripte samast päritolust ja mis tahesgoogle.com
-i alamdomeenist.
default-src
See direktiiv toimib varuvariandina teistele ressursitüüpidele, kui need pole selgesõnaliselt määratletud. Näiteks, kui script-src
pole määratud, kehtib skriptidele default-src
. Hea tava on määratleda default-src
, et seada turvalisuse baastase.
Näide:
default-src 'self'; script-src 'self' https://cdn.example.com;
Selles näites laaditakse kõik ressursid (pildid, stiililehed, fondid jne) vaikimisi ainult samast päritolust. Skriptidel on aga leebem poliitika, mis lubab neid samast päritolust ja määratud CDN-ist.
base-uri
See direktiiv piirab URL-e, mida saab kasutada dokumendi <base>
sildis. <base>
silt võib muuta kõigi lehel olevate suhteliste URL-ide baas-URL-i, sealhulgas skriptiallikate oma. Selle piiramine takistab ründajal manipuleerida, kuhu suhtelised skriptiteed lahendatakse.
Näide:
base-uri 'self';
See tagab, et <base>
sildi saab määrata ainult samale päritolule.
object-src
See direktiiv kontrollib laaditavate pistikprogrammide tüüpe, nagu Flash, Java apletid jne. On oluline seada see väärtusele 'none'
, kuna pistikprogrammid on sageli vananenud ja kätkevad endas märkimisväärseid turvariske. Kui te ei kasuta ühtegi pistikprogrammi, on selle seadmine väärtusele 'none'
tugev turvameede.
Näide:
object-src 'none';
upgrade-insecure-requests
See direktiiv annab brauseritele korralduse uuendada päringud HTTPS-ile. Kui teie sait toetab HTTPS-i, kuid võib esineda segasisu probleeme (nt ressursside laadimine üle HTTP), aitab see direktiiv automaatselt muuta need ebaturvalised päringud turvalisteks, vältides segasisu hoiatusi ja potentsiaalseid haavatavusi.
Näide:
upgrade-insecure-requests;
report-uri
/ report-to
Need direktiivid on teie CSP jälgimiseks ja silumiseks elutähtsad. Kui brauser tuvastab teie CSP rikkumise (nt blokeeritud skripti), võib see saata JSON-raporti määratud URL-ile. See võimaldab teil tuvastada potentsiaalseid rünnakuid või valesid konfiguratsioone oma poliitikas.
report-uri
: Vanem, laialdaselt toetatud direktiiv.report-to
: Uuem, paindlikum direktiiv, mis on osa Reporting API-st.
Näide:
report-uri /csp-report-endpoint;
report-to /csp-report-endpoint;
Nende raportite vastuvõtmiseks ja töötlemiseks vajate serveripoolset lõpp-punkti (nt /csp-report-endpoint
).
CSP rakendamine: samm-sammuline lähenemine
CSP tõhus rakendamine nõuab metoodilist lähenemist, eriti olemasolevate rakenduste puhul, mis võivad suuresti tugineda tekstisisestele skriptidele või dünaamilise koodi hindamisele.
1. samm: alustage ainult raporteeriva poliitikaga
Enne CSP jõustamist ja oma rakenduse potentsiaalset lõhkumist alustage CSP kasutuselevõtuga Content-Security-Policy-Report-Only
režiimis. See režiim võimaldab teil jälgida rikkumisi ilma ühtegi ressurssi tegelikult blokeerimata. See on hindamatu väärtusega, et mõista, mida teie rakendus praegu teeb ja mida on vaja valgesse nimekirja lisada.
Näide ainult raporteerivast päisest:
Content-Security-Policy-Report-Only: default-src 'self'; script-src 'self'; report-uri /csp-report-endpoint;
Raportite saamisel näete, milliseid skripte blokeeritakse. Seejärel saate oma poliitikat iteratiivselt kohandada, et lubada legitiimseid ressursse.
2. samm: analĂĽĂĽsige CSP rikkumiste raporteid
Seadistage oma raporteerimise lõpp-punkt ja analüüsige sissetulevaid JSON-raporteid. Otsige mustreid blokeeritud ressurssidest. Levinud rikkumised võivad hõlmata:
- Tekstisisene JavaScript (nt
onclick
atribuudid,<script>alert('xss')</script>
). - JavaScript, mis on laaditud kolmanda osapoole CDN-ist, mida ei olnud valgesse nimekirja lisatud.
- DĂĽnaamiliselt genereeritud skripti sisu.
3. samm: jõustage poliitika järk-järgult
Kui teil on hea arusaam oma rakenduse ressursside laadimismustritest ja olete oma poliitikat raportite põhjal kohandanud, saate lülituda Content-Security-Policy-Report-Only
päiselt tegelikule Content-Security-Policy
päisele.
Näide jõustavast päisest:
Content-Security-Policy: default-src 'self'; script-src 'self'; report-uri /csp-report-endpoint;
4. samm: refaktoreerige ebaturvaliste praktikate kõrvaldamiseks
Lõppeesmärk on eemaldada oma CSP-st 'unsafe-inline'
, 'unsafe-eval'
ja liigsed metamärgid. See nõuab teie JavaScripti koodi refaktoreerimist:
- Eemaldage tekstisisesed skriptid: Teisaldage kõik tekstisisesed JavaScripti sündmuste käsitlejad (nagu
onclick
,onerror
) eraldi JavaScripti failidesse ja lisage need, kasutadesaddEventListener
. - Eemaldage tekstisisesed sündmuste käsitlejad:
- Käsitlege dünaamilist skriptide laadimist: Kui teie rakendus laadib skripte dünaamiliselt, veenduge, et need skriptid hangitaks heakskiidetud päritoludest.
- Asendage `eval()` ja `new Function()`: Need on võimsad, kuid ohtlikud. Kui neid kasutatakse, kaaluge turvalisemaid alternatiive või refaktoreerige loogika. Sageli on JSON-i parsimine
JSON.parse()
-ga turvalisem alternatiiv, kui eesmärk oli JSON-i parsimine. - Kasutage tekstisiseste skriptide jaoks nonce'e või räsiväärtusi (kui see on absoluutselt vajalik): Kui tekstisiseste skriptide refaktoreerimine on keeruline, pakub CSP mehhanisme konkreetsete tekstisiseste skriptide lubamiseks ilma turvalisust liigselt kahjustamata.
<button onclick="myFunction()">Click me</button>
// Refaktoreeritud:
// Teie JS-failis:
document.querySelector('button').addEventListener('click', myFunction);
function myFunction() { /* ... */ }
Nonce'id tekstisiseste skriptide jaoks
Nonce (number used once) on juhuslikult genereeritud string, mis on iga päringu jaoks unikaalne. Saate manustada nonce'i oma CSP päisesse ja tekstisisestesse <script>
siltidesse, mida soovite lubada.
Näide:
Serveripoolne (nonce'i genereerimine):
// Teie serveripoolses koodis (nt Node.js koos Expressiga):
const crypto = require('crypto');
const nonce = crypto.randomBytes(16).toString('hex');
res.setHeader(
'Content-Security-Policy',
`script-src 'self' 'nonce-${nonce}'; object-src 'none'; ...`
);
// Teie HTML-mallis:
<script nonce="${nonce}">
// Teie tekstisisene JavaScript siin
</script>
Brauser käivitab ainult need tekstisisesed skriptid, millel on sobiv nonce-atribuut.
Räsiväärtused tekstisiseste skriptide jaoks
Saate määrata ka konkreetsete tekstisiseste skriptiplokkide räsiväärtusi. Brauser arvutab tekstisiseste skriptide räsi ja võrdleb seda CSP-s olevate räsiväärtustega. See on kasulik staatiliste tekstisiseste skriptide jaoks, mis ei muutu iga päringuga.
Näide:
Kui teie tekstisisene skript on alert('Hello CSP!');
, oleks selle SHA256 räsi J9cQkQn3+tGj9Gv2aL+z0+tJ+K/G2gL7xT0f2j8q0=
(selle peate arvutama tööriista abil).
CSP päis:
Content-Security-Policy: script-src 'self' 'sha256-J9cQkQn3+tGj9Gv2aL+z0+tJ+K/G2gL7xT0f2j8q0=';
See on vähem paindlik kui nonce'id, kuid sobib konkreetsete, muutumatute tekstisiseste koodilõikude jaoks.
5. samm: pidev jälgimine ja täiustamine
Turvalisus on pidev protsess. Vaadake regulaarselt üle oma CSP rikkumiste raporteid. Teie rakenduse arenedes võidakse kasutusele võtta uusi kolmandate osapoolte skripte või olemasolevaid uuendada, mis nõuab teie CSP kohandamist. Olge valvsad ja uuendage oma poliitikat vastavalt vajadusele.
Levinud JavaScripti turvaaugud ja CSP lahendused
Uurime mõningaid levinud JavaScripti turvaprobleeme ja seda, kuidas CSP aitab neid leevendada:
1. SaidiĂĽlene skriptimine (XSS) tekstisiseste skriptide kaudu
Probleem: Ründaja süstib pahatahtliku JavaScripti otse teie lehe HTML-i, sageli läbi kasutaja sisendi, mida pole korralikult puhastatud. See võib olla skriptisilt või tekstisisene sündmuste käsitleja.
CSP lahendus:
- Keelake tekstisisesed skriptid: Eemaldage
'unsafe-inline'
script-src
direktiivist. - Kasutage nonce'e või räsiväärtusi: Kui tekstisisesed skriptid on vältimatud, kasutage nonce'e või räsiväärtusi, et lubada ainult konkreetseid, ettenähtud skripte.
- Puhastage kasutaja sisend: See on fundamentaalne turvapraktika, mis täiendab CSP-d. Puhastage ja valideerige alati kõik andmed, mis pärinevad kasutajatelt, enne nende kuvamist oma lehel.
2. XSS kolmandate osapoolte skriptide kaudu
Probleem: Legitiimne kolmanda osapoole skript (nt CDN-ist, analüütikapakkujalt või reklaamivõrgustikust) on kompromiteeritud või sisaldab haavatavust, mis võimaldab ründajatel selle kaudu pahatahtlikku koodi käivitada.
CSP lahendus:
- Olge kolmandate osapoolte skriptidega valiv: Kaasake ainult usaldusväärsetest allikatest pärit skripte.
- Määrake allikad täpselt: Selle asemel, et kasutada metamärke nagu
*.example.com
, loetlege selgesõnaliselt täpsed domeenid (ntscripts.example.com
). - Kasutage alamressursi terviklikkust (SRI): Kuigi SRI ei ole otseselt CSP osa, pakub see täiendavat kaitsekihti. See võimaldab teil määrata oma skriptifailidele krüptograafilised räsiväärtused. Brauser käivitab skripti ainult siis, kui selle terviklikkus vastab määratud räsile. See takistab kompromiteeritud CDN-il teie skripti pahatahtliku versiooni serveerimist.
Näide CSP ja SRI kombineerimisest:
HTML:
<script src="https://trusted.cdn.com/library.js" integrity="sha256-abcdef123456..." crossorigin="anonymous"></script>
CSP päis:
Content-Security-Policy: script-src 'self' https://trusted.cdn.com;
...
3. Andmesisestus ja DOM-i manipuleerimine
Probleem: Ründajad võivad proovida süstida andmeid, mis manipuleerivad DOM-i või meelitavad kasutajaid toiminguid sooritama. See võib mõnikord hõlmata dünaamiliselt genereeritud JavaScripti.
CSP lahendus:
- Keelake
'unsafe-eval'
: See direktiiv takistab JavaScripti koodi hindamist funktsioonidega nagueval()
,setTimeout()
stringiargumentidega võinew Function()
. Neid kasutatakse sageli koodi dünaamiliseks käivitamiseks, mis võib olla turvarisk. - Ranged `script-src` direktiivid: Lubatud allikate selgesõnalise määramisega vähendate tahtmatu skripti käivitamise võimalust.
4. Klikikaaperdamine (Clickjacking)
Probleem: RĂĽndajad meelitavad kasutajaid klikkima millelegi muule, kui nad tajuvad, tavaliselt peites legitiimsed elemendid pahatahtlike taha. Seda saavutatakse sageli, manustades teie saidi iframe'i pahatahtlikule saidile.
CSP lahendus:
frame-ancestors
direktiiv: See direktiiv kontrollib, millistel päritoludel on lubatud teie lehte manustada.
Näide:
Content-Security-Policy: frame-ancestors 'self';
See poliitika takistab teie lehe manustamist iframe'i mis tahes muul domeenil peale omaenda. frame-ancestors 'none';
seadistamine takistab selle manustamist kõikjal.
Globaalselt rakendatavad CSP strateegiad
CSP rakendamisel globaalsele publikule arvestage järgmisega:
- Sisuedastusvõrgud (CDN-id): Paljud rakendused kasutavad staatiliste varade serveerimiseks globaalseid CDN-e. Veenduge, et nende CDN-ide domeenid on teie
script-src
ja muudes asjakohastes direktiivides korrektselt valgesse nimekirja kantud. Pidage meeles, et erinevad piirkonnad võivad kasutada erinevaid CDN-i servaservereid, kuid CSP jaoks on oluline domeen ise. - Rahvusvahelised domeeninimed (IDN-id): Kui teie rakendus kasutab IDN-e, veenduge, et need oleksid teie CSP-s korrektselt esindatud.
- Kolmandate osapoolte teenused: Rakendused integreeruvad sageli erinevate rahvusvaheliste kolmandate osapoolte teenustega (nt makselüüsid, sotsiaalmeedia vidinad, analüütika). Kõik need teenused võivad nõuda konkreetsete domeenide lisamist valgesse nimekirja. Jälgige hoolikalt kõiki kolmandate osapoolte skriptiallikaid.
- Vastavus ja regulatsioonid: Erinevates piirkondades on erinevad andmekaitse-eeskirjad (nt GDPR Euroopas, CCPA Californias). Kuigi CSP ise ei tegele otseselt andmekaitse vastavusega, on see oluline turvameede, mis toetab vastavust, vältides andmete väljaviimist.
- Testimine erinevates piirkondades: Kui teie rakendusel on erinevates piirkondades erinevad juurutused või konfiguratsioonid, testige oma CSP rakendust igas neist.
- Keel ja lokaliseerimine: CSP direktiivid ja nende väärtused on standardiseeritud. Poliitikat ennast ei mõjuta kasutaja keel ega piirkond, kuid ressursid, millele see viitab, võivad asuda geograafiliselt hajutatud serverites.
Parimad praktikad CSP rakendamiseks
Siin on mõned parimad praktikad, et tagada robustne ja hooldatav CSP rakendus:
- Alustage rangelt ja laiendage järk-järgult: Alustage võimalikult piirava poliitikaga (nt
default-src 'none';
) ja lisage seejärel oma rakenduse vajadustest lähtuvalt lubatud allikaid, kasutades laialdaseltContent-Security-Policy-Report-Only
režiimi. - Vältige
'unsafe-inline'
ja'unsafe-eval'
kasutamist: On teada, et need nõrgendavad oluliselt teie turvalisust. Eelistage oma koodi refaktoreerimist nende kõrvaldamiseks. - Kasutage konkreetseid allikaid: Eelistage võimaluse korral konkreetseid domeeninimesid metamärkidele (
*.example.com
). Metamärgid võivad tahtmatult lubada rohkem allikaid, kui on ette nähtud. - Rakendage raporteerimine: Kaasake alati
report-uri
võireport-to
direktiiv. See on oluline rikkumiste jälgimiseks ja potentsiaalsete rünnakute või valede konfiguratsioonide tuvastamiseks. - Kombineerige teiste turvameetmetega: CSP on üks kaitsekiht. See töötab kõige paremini koos teiste turvapraktikatega, nagu sisendi puhastamine, väljundi kodeerimine, turvalised kodeerimistavad ja regulaarsed turvaauditid.
- HTTP vs. meta-sildid: Kuigi CSP-d saab seada ka meta-sildi kaudu (
<meta http-equiv="Content-Security-Policy" content="...">
), on üldiselt soovitatav seada see HTTP-päiste kaudu. HTTP-päised pakuvad paremat kaitset, eriti teatud süstimisrünnakute vastu, mis võiksid meta-silti muuta. Samuti töödeldakse HTTP-päiseid enne lehe sisu renderdamist, pakkudes varasemat kaitset. - Kaaluge CSP taset 3: Uuemad CSP versioonid (nagu tase 3) pakuvad täpsemaid funktsioone ja paindlikkust. Hoidke end kursis viimaste spetsifikatsioonidega.
- Testige põhjalikult: Enne CSP muudatuste tootmisesse viimist testige neid ulatuslikult testkeskkondades ning erinevates brauserites ja seadmetes.
Tööriistad ja ressursid
Mitmed tööriistad aitavad teil oma CSP-d luua, testida ja hallata:
- Google'i CSP hindaja: Veebipõhine tööriist, mis analüüsib teie veebisaidi CSP-d ja annab soovitusi. (
https://csp-evaluator.withgoogle.com/
) - CSP direktiivide viide: Põhjalik nimekiri CSP direktiividest ja nende selgitustest. (
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/Using_directives
) - Veebipõhised CSP generaatorid: Tööriistad, mis aitavad teil luua esialgse CSP vastavalt teie rakenduse nõuetele.
Kokkuvõte
Sisuturbe poliitika on asendamatu tööriist igale veebiarendajale, kes on pühendunud turvaliste rakenduste loomisele. Kontrollides hoolikalt allikaid, kust teie veebirakendus saab ressursse, eriti JavaScripti, laadida ja käivitada, saate oluliselt vähendada laastavate rünnakute, nagu XSS, riski. Kuigi CSP rakendamine võib esialgu tunduda hirmutav, eriti keerukate rakenduste puhul, viib struktureeritud lähenemine, alustades raporteerimisest ja järk-järgult poliitikat karmistades, turvalisema ja vastupidavama veebikohaloluni.
Pidage meeles, et turvalisus on arenev valdkond. Mõistes ja aktiivselt rakendades põhimõtteid nagu sisuturbe poliitika, võtate ennetava hoiaku oma kasutajate ja andmete kaitsmisel globaalses digitaalses ökosüsteemis. Võtke CSP omaks, refaktoreerige oma koodi ja olge valvsad, et ehitada turvalisem veeb kõigile.