A Content-Security-Policy (CSP) egy HTTP-válaszfejléc, amely megszabja a böngészőnek, honnan tölthet be és futtathat erőforrást az oldalad. Amit a szabály nem enged, azt a böngésző egyszerűen nem hajtja végre.
Hogyan működik
A fejléc irányelvekből (direktívákból) áll. A leggyakoribbak:
default-src: alapszabály minden erőforrás-típusra.
script-src: honnan jöhet JavaScript.
style-src: honnan jöhet CSS.
frame-ancestors: ki ágyazhatja be az oldalad iframe-be.
base-uri és form-action: a <base> tag és az űrlapok célja.
A böngésző minden egyes kérésnél összeveti a forrást a szabállyal. Ha nem fér bele, blokkolja, és hibát ír a konzolba. A CSP tehát kliensoldali védelem, nem szerveroldali tűzfal.
Mi ellen véd
Elsősorban a XSS (cross-site scripting) ellen. Ha egy támadó szkriptet szúr be egy űrlapon vagy kommentmezőn keresztül, a szigorú script-src megakadályozza a lefutását. A sérülékenységet nem javítja meg, csak a kárt korlátozza. Második védelmi vonalként érdemes rá gondolni, a biztonsági HTTP-fejlécek családjának legerősebb, de legmunkásabb tagjaként.
Miért számít a gépi olvasatnál
A CSP önmagában nem rangsorolási tényező. Egy elrontott szabály viszont letilthatja a saját szkriptjeidet is. Ilyenkor a tartalom egy része meg sem jelenik a renderelt HTML-ben. Ez ugyanúgy érinti a keresőrobotokat és a nyelvi modellek olvasatát, mint az embereket. A szigorú CSP mellékhatásként az inline CSS és az inline <script> használatát is kiszorítja.
Röviden: a CSP azt mondja meg a böngészőnek, melyik kódban bízhat meg, és minden mást eldob.
Miért fontos
A CSP nélkül egyetlen beszúrt szkript is elég ahhoz, hogy adatot lopjon vagy átirányítson. A bankkártyaadatokat kezelő oldalakon ez közvetlen pénzügyi és jogi kockázat.
A gyakorlati következmények:
- Egy feltört plugin által beszúrt külső szkript nem fut le, ha a
script-src nem engedi.
- A
frame-ancestors megakadályozza a clickjackinget, és kiváltja a régi X-Frame-Options fejlécet.
- Az
upgrade-insecure-requests irányelvvel a mixed content (kevert tartalom) hibák nagy része eltűnik.
Az üzleti oldala egyszerű. Egy kompromittált webshop napokra kiesik, és a helyreállítás sokszorosába kerül, mint a fejléc beállítása. A CSP hatása egy auditban alacsony, mert a látogatók és a keresők nem érzékelik. A kockázatcsökkentése viszont valódi.
Mit néz ebből a riport
Az audit egyetlen dolgot ellenőriz: küld-e az oldal Content-Security-Policy fejlécet. Ha nincs, alacsony hatású hiányként jelenik meg, a hatókör pedig környezet vagy hoszting. A riport ajánlása ugyanaz, mint fent: állíts be CSP fejlécet az XSS elleni védelemhez.
Technikai példa
Egy használható kiindulási szabály, nonce-alapú szkript-engedéllyel:
Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-{RANDOM}' 'strict-dynamic' https:; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self' data:; connect-src 'self' https:; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'self'; upgrade-insecure-requests
A {RANDOM} helyére kérésenként új, véletlen érték kerül. Ugyanez az érték megy a HTML-be: <script nonce="{RANDOM}">.
Ellenőrzés parancssorból, csak a lényeges sorokra szűrve:
curl -sI https://pelda.hu | grep -i "content-security-policy"
Ha üres a válasz, nincs beállítva a fejléc. Bevezetés előtt cseréld a fejléc nevét Content-Security-Policy-Report-Only értékre. Így semmit nem blokkol, csak jelent.
Gyakori kérdések
Lassítja a CSP az oldalt?
Nem. A fejléc néhány száz bájt, az ellenőrzést pedig a böngésző végzi el futás közben. Mérhető sebességhatása nincs. Ami lassíthat, az a rosszul beállított szabály miatt újratöltött vagy hibázó szkript.
Jobb lesz tőle a Google-rangsorom?
Közvetlenül nem. A CSP nem rangsorolási tényező, és a keresők nem jutalmazzák külön. Közvetve viszont segít: a feltört, spamre átirányított oldal komoly rangsorvesztést okoz.
Miért törnek el a szkriptjeim a CSP bekapcsolása után?
Mert valamelyik forrás nem szerepel a szabályban. Nyisd meg a konzolt, és nézd meg a blokkolt kéréseket. Minden ilyen sor megmondja, melyik irányelvbe ütközött. Ezért érdemes Report-Only módban indulni.
Elég a default-src 'self' szabály?
Kezdésnek jó, de a legtöbb valódi oldalon kevés. A külső betűtípusok, analitika és címkekezelő azonnal blokkolásra kerülnek. Bővítsd irányelvenként, addig, amíg csak a ténylegesen használt forrásokat engeded.
Kell CSP, ha van tűzfal és biztonsági plugin?
Igen, mert más réteget véd. A tűzfal a szerverhez érkező kéréseket szűri, a CSP a böngészőben futó kódot korlátozza. Ha egy sérülékenységen keresztül mégis bejut valami, a CSP az utolsó fék.