Tegnap éjjel az oldalam tizenegyszer mondott nemet. Mi az a CSP, és miért kellene neked is?
Szombat reggel egy levél várt: „Új CSP-sértések a webaktivator.hu oldalon. Ebből 11 tételt a böngésző ténylegesen eldobott.”
Magyarul: az éjszaka folyamán tizenegyszer fordult elő, hogy valaki olyan kódot akart lefuttatni az oldalamon, amit én nem engedtem — és a látogató böngészője mind a tizenegyszer megállította.
Ezúttal ártalmatlan volt. Utánanéztem: egy adatgyűjtő robot járta végig a blogcikkeimet, és a saját segédkódját próbálta az oldalba juttatni. A böngésző nem engedte, és szólt nekem. Az oldal közben ugyanúgy működött mindenkinek.
De ha nem robot lett volna, hanem valaki, aki a látogatóim bankkártya-adatait akarja elkapni? Akkor is ugyanez történt volna: megállítás, jelentés, és én reggel tudtam volna róla.
A legtöbb weboldal-tulajdonos ezt nem tudja meg. Nem azért, mert nem figyel, hanem mert nincs mit figyelnie: az oldalán nincs olyan szabály, ami nemet mondana, és nincs, ami jelentene.
Egy weboldal nem egy fájl, hanem egy összeszerelt csomag
Amikor megnyitsz egy weboldalt, a böngésződ nem egyetlen dolgot tölt le. Letölti az oldal szövegét, aztán az abban felsorolt dolgokat: betűtípusokat, képeket, a sütibannert, a Google Analytics mérőkódját, egy időpontfoglaló naptárat, egy chatablakot, egy videót. Ezek egy része a saját szerveredről jön, a többi harmadik féltől.
A böngésző alapesetben mindent lefuttat, amit az oldal kér. Nem kérdezi meg, hogy ez a kód jogosan van-e ott. Ha valahogy bekerül egy idegen sor az oldaladba, a böngésző azt is ugyanolyan szorgalmasan végrehajtja, mint a sajátodat.
És idegen kód többféle úton kerülhet be:
- Egy feltört vagy elavult bővítmény. WordPress-oldalon egy frissítetlen bővítmény a leggyakoribb bejárat.
- Egy megfertőzött külső szolgáltatás. Te nem változtattál semmin — a szolgáltató szerverén cserélték ki a kódot, amit az oldalad minden betöltéskor behúz. 2024 nyarán így kapott rosszindulatú kódot egyszerre több mint százezer weboldal, egy széles körben használt ingyenes JavaScript-szolgáltatáson (polyfill.io) keresztül. A tulajdonosok semmit nem rontottak el.
- Egy becsempészett kódrészlet. Egy rosszul védett űrlapon vagy hozzászólásban beküldött szöveg, ami kódként fut le.
Ami utána jön, az mindig ugyanaz a három forgatókönyv: az idegen kód elkapja, amit a látogató beír (név, e-mail, jelszó, kártyaszám), átirányít egy adathalász oldalra, vagy észrevétlenül hirdetést, kriptobányászt futtat a látogató gépén.
A legismertebb eset a British Airways-é: 2018-ban néhány sornyi becsempészett kód a fizetési oldalon több mint négyszázezer ügyfél adatait küldte el a támadóknak. A brit adatvédelmi hatóság 20 millió font bírságot szabott ki — azzal az indoklással, hogy a cég nem gondoskodott a GDPR által elvárt „megfelelő biztonságról”.
A CSP egy vendéglista a bejáratnál
A CSP (Content Security Policy, tartalombiztonsági szabályzat) egy rövid szabálylista, amit a weboldal minden betöltéskor átad a böngészőnek. Ilyesmit mond:
„Ezen az oldalon csak a saját szerveremről, a Google mérőkódjáról és az időpontfoglaló naptáramról futhat kód. Űrlapot csak ide lehet elküldeni. Minden mást tilts le — és ha ilyet látsz, szólj nekem.”
Olyan, mint egy vendéglista egy rendezvény bejáratánál. Aki rajta van, bemegy. Aki nincs rajta, nem jut be — akkor sem, ha nagyon meggyőzően kopogtat. És a portás minden visszafordított vendégről feljegyzést készít.
Ez a fontos különbség a legtöbb biztonsági megoldáshoz képest: a védelem a látogató böngészőjében történik. Ha az idegen kód valahogy be is jutott az oldaladba — egy feltört bővítményen vagy egy megfertőzött külső szolgáltatáson át —, a böngésző akkor sem futtatja le, mert nincs a listán.
A „szólj nekem” rész pedig legalább annyira értékes, mint a tiltás. Enélkül a támadás csendes: az oldal működik, a forgalom megvan, csak éppen valaki más is olvassa, amit a látogatóid beírnak.
Mit nyersz vele?
A legveszélyesebb támadások nem futnak le. Kártyaadat-lopás, űrlapadatok elszívása, átirányítás adathalász oldalra — mindegyikhez az kell, hogy idegen kód fusson az oldaladon, vagy hogy az adat idegen szerverre menjen. A vendéglista mindkettőt megfogja.
Tudsz róla. Nem hónapokkal később, egy vevő panaszából vagy egy böngésző piros figyelmeztetéséből értesülsz, hanem másnap reggel, egy összefoglalóból.
Rendben tartott oldalad lesz. A lista összeállításakor kiderül, mi mindent tölt be valójában az oldalad. Nálam is előkerült olyan külső forrás, amiről már elfelejtettem, hogy ott van.
Érv az adatvédelemhez. A GDPR „megfelelő technikai intézkedéseket” vár el a személyes adatok védelméhez. A CSP nem kötelező, de az egyik legjobb bizonyíték arra, hogy komolyan veszed, mi történik a látogatóid adataival.
Mit veszíthetsz, ha kihagyod?
A legtöbb kisvállalkozás oldalán nincs CSP. Ez nem azt jelenti, hogy baj lesz — azt jelenti, hogy ha baj lesz, nem fogod tudni.
- A látogatóid adatait. Ha az űrlapodon keresztül ellopják az ügyfeleid adatait, az adatvédelmi incidens. 72 órád van bejelenteni a hatóságnak, és az érintetteket is értesíteni kell. Ez akkor is kínos, ha a bírság elmarad.
- A forgalmadat. Ha az oldaladról adathalász oldalra irányítanak, a Google és a böngészők hamar „megtévesztő webhely” figyelmeztetést tesznek elé. Onnantól a látogató egy piros oldalt lát, nem a tiédet. Egy korábbi cikkemben leírtam, milyen nehéz ebből kimászni: egy év múlva is ott volt a jelölés.
- A bizalmat. Egy kártyaadat-lopás után az ügyfél nem azt fogja mondani, hogy „a bővítmény volt a hibás”. Azt fogja mondani, hogy nálad lopták el.
Miért nincs akkor mindenhol?
Mert nem egyszeri beállítás, hanem folyamatos munka.
Ha a vendéglista hiányos, a böngésző a jogos vendéget is kizárja — és ezt senki nem veszi észre, mert a szerver szerint minden rendben van. Egy elfelejtett tétel, és az időpontfoglaló naptár egyszerűen nem jelenik meg. Az ügyfél nem ír, csak elmegy.
Ezért a CSP-hez három dolog kell:
- Óvatos bevezetés. Először csak mérő módban fut: nem tilt semmit, csak jelenti, mit tiltana. Valódi böngészőben végigjárom az oldalt, és csak akkor kapcsolom éles védelemre, ha minden jogos forrás a listán van.
- Karbantartás. Minden új eszköznél — új naptár, új chatablak, új mérőkód — a listát is frissíteni kell.
- Valaki, aki olvassa a jelentéseket. A jelentések nagy része ártalmatlan: robotok, böngésző-kiegészítők (egy fordító vagy hirdetésblokkoló is kódot tesz az oldalba). Ezeket el kell választani attól a néhánytól, ami valódi. Ez a munka tette ki a szombat reggelemet is: tizenegy jelentés, egy robot, teendő nincs.
A nagy cégek — bankok, webáruházak, a nagy tech-szolgáltatók — ezt rutinszerűen csinálják, mert van rá biztonsági csapatuk. A kisvállalkozások oldalain ritka, pedig a kockázat ugyanaz: a támadó robotjai nem nézik, mekkora cég van a domain mögött.
Hogyan csinálom én?
A saját oldalamon már egy ilyen vendéglista fogadja a látogatókat.
A folyamat:
- mérő mód, végigjárás valódi böngészőben, aztán élesítés;
- a jelentéseket egy gyűjtő fogadja, ami nem tárol IP-címet, böngészőazonosítót vagy sütit — csak azt, hogy melyik szabály, mit, melyik oldalon fogott meg;
- naponta legfeljebb egy összefoglaló e-mail, csak az új esetekről;
- ha egy jelentés kétes, valódi böngészőben újramérem, mielőtt bármit változtatnék.
Ugyanezt a Weblap-upgrade részeként a te oldaladon is meg tudom csinálni — a mentés, a folyamatos figyelés és a havi javítások mellett.
Nézd meg most, van-e ilyen az oldaladon
Két perc az egész:
- Nyisd meg a securityheaders.com oldalt, és írd be a weboldalad címét.
- Keresd a listában a Content-Security-Policy sort. Ha piros, nincs vendéglistád.
Ha nincs, az nem jelenti, hogy baj van. Azt jelenti, hogy ha lenne, nem tudnál róla. Ha szeretnéd, hogy tudj: írj nekem.
Akadálypálya helyett sportautó. Nézzük meg együtt, hol szivárog el a költésed.
Szivárgás-audit →