Siguri
Koka Content-Security-Policy
Politika që përcakton nga cilat burime lejohet kod dhe përmbajtje; mbrojtja kryesore kundër XSS.
Çfarë është
Content-Security-Policy është një listë rregullash që i thonë shfletuesit nga ku lejohet të vijë çdo lloj burimi: skripta, stile, imazhe, fonte, korniza, lidhje.
Parimi është ndryshim i parazgjedhjes. Pa CSP, shfletuesi ekzekuton çdo skript që gjen në faqe, nga kudo. Me CSP, ai ekzekuton vetëm atë që politika e lejon shprehimisht.
Kjo e kthen një sulm XSS nga "kod i huaj që xhiron" në "kërkesë e bllokuar dhe e raportuar". Sulmuesi mund ta fusë skriptin, por shfletuesi nuk e ekzekuton.
CSP-ja nuk është një rregull i vetëm por një grup direktivash, dhe fuqia e saj varet krejt nga sa e rreptë është.
Pse ka rëndësi
XSS mbetet një nga dobësitë më të shfrytëzuara në ueb, dhe pasojat e saj janë të plota: kodi i sulmuesit xhiron me të njëjtat të drejta si kodi yt. Ai lexon sesionin, ndryshon faqen, dërgon çdo gjë që shkruan përdoruesi.
Mbrojtja e zakonshme — shmangia e daljeve — është e domosdoshme por e brishtë: mjafton një vend i vetëm ku harrohet. CSP-ja është shtresa e dytë që e bën atë harresë jo fatale.
Ajo mbron edhe nga një rrezik i dytë që rritet: skriptet e palëve të treta. Një bibliotekë e komprometuar në një CDN mund të vjedhë të dhëna nga formulari yt i pagesës. Me connect-src të kufizuar, ajo nuk i dërgon dot askund.
Kostoja është reale: një CSP e rreptë kërkon që të mos ketë skripta dhe stile inline pa nonce. Kjo shpesh do të thotë rishkrim.
Si rregullohet
# fillimisht vetëm raporto, mos blloko asgjë
Content-Security-Policy-Report-Only: default-src 'self'; report-uri /csp-raport
# pastaj, politika e vërtetë
Content-Security-Policy:
default-src 'self';
script-src 'self' 'nonce-R4nd0m';
style-src 'self' 'nonce-R4nd0m';
img-src 'self' data:;
frame-ancestors 'none';
base-uri 'self';
form-action 'self'Hapat:
- Fillo me `Report-Only`. Mblidh raportet për një ose dy javë para se të bllokosh.
- Shmang `unsafe-inline` dhe `unsafe-eval`. Me to, CSP-ja humb pjesën më të madhe të vlerës.
- Përdor `nonce` të ri për çdo përgjigje, kurrë një vlerë të fiksuar.
- `frame-ancestors 'none'` e zëvendëson X-Frame-Options me kontroll më të imët.
- Mos harro `base-uri` dhe `form-action` — pa to, sulmuesi mund ta ridrejtojë formularin.
Si e mat ky mjet
SecurityAnalyzer::checkSecurityHeaders() (services/SecurityAnalyzer.php:90) kalon nëpër një tabelë me gjashtë koka (:92–99). Rreshti për këtë kokë është services/SecurityAnalyzer.php:94.
Për secilën kontrollohet vetëm nëse çelësi content-security-policy ekziston te kokat e përgjigjes dhe nuk është bosh (:103). Kur ekziston, jepet konstatim i kaluar me vlerën e plotë të kokës (:105); kur mungon, jepet konstatim me tekstin e ndreqjes (:109).
Kjo kokë është në grupin e rëndë: mungesa e saj jep paralajmërim me ndikim të lartë (services/SecurityAnalyzer.php:107).
Çfarë NUK e mat
Kontrolli mat praninë e kokës, jo vlerën e saj. Çdo vlerë, sado e dobët ose e pakuptimtë, kalon si e rregullt — kjo është kufizimi kryesor dhe vlen për të gjashtë kokat e sigurisë.
Për CSP-në pasoja është e madhe: një politikë si default-src *; script-src 'unsafe-inline' 'unsafe-eval' * — që praktikisht nuk ndalon asgjë — raportohet si kokë e vendosur dhe kontrolli kalon. Vlerësimi i vërtetë i një CSP-je kërkon analizë të çdo direktive, dhe ai nuk bëhet fare.
Nuk zbulohet as Content-Security-Policy-Report-Only, e cila nuk bllokon asgjë. Nuk lexohet as CSP e deklaruar me <meta http-equiv> — një faqe që e ka vendosur ashtu raportohet si pa politikë.
Kodi që e kryen matjen
services/SecurityAnalyzer.php:90— SecurityAnalyzer::checkSecurityHeadersservices/SecurityAnalyzer.php:94— content-security-policy