Defaults.Exposed

Defaults.ExposedRešenja › Content-Security-Policy (CSP)

Kako popraviti Content-Security-Policy (CSP)

Content Security Policy je bezbednosno pravilo koje vaš sajt predaje pretraživaču svakog posjetioca, govoreći mu tačno koji kod je dozvoljeno da se izvršava. Bez njega, ako ikad nešto zloćudno dospije na stranicu — putem komentarskog polja, hakovanog plugina ili skripte treće strane — pretraživač će ga slobodno izvršiti, uključujući kod koji tiho prikuplja kartične podatke i lozinke vaših kupaca dok ih upisuju, i pored toga što je katanac i dalje prikazan.

Suština za vaše poslovanje: Ako je vaš sajt ikad dira, zloćudni kod može čitati kartične i login podatke vaših kupaca direktno s vašeg checkoutа dok sve izgleda potpuno normalno — ostavljajući vas s chargebackima, prijavama prevare, prijavljivim prodorom podataka i neuspehom provere koji bezbednosni timovi većih klijenata koriste da zaustave ili ubiju posao.

Šta vam ovo može koštati

Zašto je to važno. Katanac dokazuje da je veza s vašim sajtom privatna, ali ništa ne kontroliše koji kod se izvršava jednom kad je posjetilac na stranici. Content Security Policy je zaštita koja to radi — govori pretraživačima da ignorišu svaku skriptu koja nije došla od izvora kojima vjerujete, pa jedno izmijenjeno polje, oglas ili plugin ne može biti pretvoren u alat za krađu novca i podataka vaših kupaca. To je bodovana provjera na vašem scorecardu, vrijedi prave bodove, i jedna je od prvih stvari koje profesionalna bezbednosna revizija traži.

Šta je ovo, jednostavnim rečima

Kad neko posjeti vaš sajt, pretraživač preuzima vašu stranicu i izvršava sav kod na njoj — skripte koje čine padajuće meniije, dugmad, forme za plaćanje i sve ostalo. Po defaultu, pretraživač im svemu vjeruje. Nema načina znati koji je kod zaista vaš, a koji je ubacio neko drugi.

Content Security Policy (često skraćeno CSP) je kratka lista pravila koje vaš sajt prilaže svakoj stranici, govoreći pretraživaču: “izvršavaj samo kod s ovih izvora koje sam odobrio, i odbij sve ostalo.” To je razlika između noćnog kluba koji pušta svakoga i onog koji ima listu gostiju na vratima.

Razlog zbog kojeg je ovo toliko bitno je što se sajtovi stalno diraju — ne uvek hakovanjem servera, već kroz zadnja vrata koja većina sajtova ostavlja otvorena: polje za komentare, polje za pretragu, zastarjeli plugin, skripta treće strane za oglase ili analitiku, ili chat widget. Ako napadač postavi i jednu liniju svog koda na jednu od vaših stranica, pretraživač ga izvršava kao da je vaš. Odatle može čitati sve što vaši kupci upisuju — brojeve kartica, lozinke, adrese — i tiho slati drugamo. Content Security Policy zatvara ta vrata odbijanjem izvršavanja bilo čega od izvora koji niste odobrili.

Šta vam ovo može koštati

Ovo nije apstraktno. Napad koji Content Security Policy sprečava — kod ubačen u stranicu koji krade podatke od vaših kupaca — stoji iza nekih od najvećih proboja skimminga kartica na rekord. Evo kako to obično ide za normalno preduzeće:

Šta je to zapravo (detalj)

Content Security Policy se isporučuje kao jedan HTTP response header — linija koju vaš web server šalje sa svakom stranicom. Njegova vrijednost je skup direktiva, svaka imenujući vrstu sadržaja i dozvoljene izvore za njega. Na primjer:

Content-Security-Policy: default-src 'self'; script-src 'self'; object-src 'none'; frame-ancestors 'self'

Jednostavnim rečima, to kaže: po defaultu učitavaj stvari samo s mog sajta; izvršavaj skripte samo s mog sajta; ne dozvoli stare plugine; i ne dozvoli drugim sajtovima da moj sajt embed-uju u frame.

Kako izgleda “dobro”. Naša provjera ne gleda samo prisustvo headera — čita politiku direktivu po direktivu i boduje koliko je zapravo jaka, kao što bi bezbednosni recenzent. Jaka politika:

Politika koja postoji, ali se oslanja na 'unsafe-inline', 'unsafe-eval' ili wildcards, i dalje će se loše bodovati — jer u praksi pruža malo stvarne zaštite. Cilj je tesna politika, ne samo bilo koja politika.

Kako popraviti (besplatno, ~1–2 sata)

Prosledite ovo vašoj IT osobi ili ko god pokreće vaš sajt — sama popravka je potpuno besplatna. Naplaćujemo jedino praćenje da ostane na snazi i ispravno tokom vremena; uključivanje ničeg ne košta. Razlog što ovo traje sat ili dva umjesto minuta je pažljivi probni korak koji sprečava slučajno blokiranje dijelova vašeg sajta.

  1. Počnite u report-only modu — nemojte još primijeniti. Dodajte Content-Security-Policy-Report-Only response header. Ovo posmatra i zapisuje šta bi bilo blokirano, a da zapravo ne blokira ništa, pa živi sajt nastavlja raditi dok učite od čega svaka stranica zaista zavisi. (Važno: report-only sam po sebi ne daje posjetiocima zaštitu — to je samo siguran prvi korak.)

  2. Izgradite politiku od onoga što vaš sajt zapravo koristi. Pregledajte izvještaje da pronađete svaki legitimni izvor skripti, stilova, fontova i slika — vaš domen, vaša analitika, vaš provajder plaćanja, vaš host fontova, vaš chat widget — i navedite ih kao dozvoljene izvore. Solidna polazna tačka je default-src 'self' plus eksplicitni unosi za pouzdane treće strane koje zaista koristite.

  3. Izbjegavajte rupe koje poništavaju cijelu postu. Klonite se 'unsafe-inline' i 'unsafe-eval' za skripte, i izbjegavajte wildcard izvore poput * i gole scheme poput https: za skripte — oni ponovo otvaraju tačno prazninu koju politika treba zatvoriti. Gdje su inline skripte neizbježne, koristite nonce ili hash da samo vaš specifičan odobren kod radi.

  4. Zaključajte framing i plugine. Dodajte frame-ancestors 'self' (ovo sprečava i da drugi sajtovi embed-uju vaš da prevare vaše kupce, i zadovoljava vezanu provjeru clickjackinga) i object-src 'none' za blokiranje legacy napada baziranih na pluginima.

  5. Prebacite se s report-only na primjenu. Jednom kad su izvještaji čisti i sajt radi, promijenite ime headera s Content-Security-Policy-Report-Only na Content-Security-Policy. Ovo je korak koji zapravo pruža zaštitu — report-only politika sama po sebi ne, i neće proći provjeru.

    Gdje postaviti header zavisi od platforme:

    • Cloudflare: Rules → Transform Rules → Modify Response Header → postavite Content-Security-Policy.
    • Nginx: add_header Content-Security-Policy "default-src 'self'; script-src 'self'; object-src 'none'; frame-ancestors 'self';" always;
    • Apache: Header always set Content-Security-Policy "default-src 'self'; script-src 'self'; object-src 'none'; frame-ancestors 'self';"
    • IIS (web.config): dodajte prilagođeni HTTP response header nazvan Content-Security-Policy s politikom kao vrijednošću.
    • Google Workspace / Microsoft 365: ovi pokreću vaš imejl, ne vaš javni sajt, pa se politika postavlja gdje god je vaš sajt zapravo hostovan (Cloudflare ili vaš web host gore), a ne u vašoj imejl admin konzoli.
  6. Ponovo proverite vaš domen da potvrdite da politika sada prikazuje kao uključena i primijenjena, bez slabljenja rupa.

Česte greške

Često postavljana pitanja

Nisam tehničar — mogu li ovo srediti sam?

Ne trebate razumjeti detalje. Ovo je podešavanje koje dodaje ko god pokreće vaš sajt ili hosting, a na servisima poput Cloudflare-a uglavnom je vođeno. Prosledite im odeljak 'Kako popraviti' ispod. Besplatno je; jedina napomena je da bi trebalo biti uvedeno pažljivo u watch-only probnom periodu da ne blokira slučajno dijelove vašeg sajta — što je tačno ono što koraci pokrivaju.

Već imam katanac i SSL sertifikat — nije li moj sajt siguran?

Katanac osigurava isporuku vaše stranice; ne policira šta se izvršava unutar nje. Ako zloćudni kod ikad završi na stranici — putem hakovanog plugina, kompromitovanog oglasa ili ubačenog polja — katanac ga neće spriječiti od krađe podataka. Content Security Policy je sloj koji ograničava šta je dozvoljeno da se izvršava uopšte. Oni štite različite stvari, i trebate oboje.

Može li uključivanje ovoga pokvariti moj sajt?

Može, ako se sve odjednom uključi agresivno, jer može blokirati legitimne skripte koje zaista koristite. Zbog toga je standardni pristup da se počne u 'report-only' probnom modu koji posmatra bez blokiranja, popravi sve što flaguje i tek tada primjeni. Urađeno na ovaj način, bezbedno je — i probni korak je ugrađen u popravku ispod.

Već smo ga stavili u 'report-only' mod — jesmo li pokriveni?

Ne, i ovo je najčešća lažna sigurnost. Report-only mod posmatra i zapisuje šta bi bilo blokirano, ali ništa ne blokira — posjetioci ne dobivaju nikakvu stvarnu zaštitu. To je jedino siguran prvi korak. Naša provjera daje report-only-u mali djelić kredita od prave politike i neće ga zabilježiti kao prolaz. Zaštićeni ste tek kad pređete na mode primjene.

Utiče li ovo na naš skor, ili je samo savjetodavno?

Utiče na vaš skor. Provjera Content Security Policy je bodovana i vrijedi do 25 bodova u kategoriji Web Bezbednosti. Nedostajuća ili slaba politika je označena kao visoka ozbiljnost i vuče vašu ocjenu dolje — a tačno je to vrsta praznine o kojoj bezbednosni upitnici klijenata pitaju.

Naš developer je dodao politiku, ali skor je i dalje nizak — zašto?

Politika može postojati, a i dalje biti slaba. Najčešniji krivci su rupe poput 'unsafe-inline' i 'unsafe-eval' za skripte, ili wildcard izvori (golo *), koji ponovo otvaraju tačno prazninu koju politika treba zatvoriti. Naša provjera čita politiku direktivi po direktivu i boduje dolje te slabosti — politika koja dozvoljava bilo šta boduje se malo bolje nego da je nema. Popravka je zaoštrivanje pravila skripti korištenjem nonces ili hashova umjesto tih rupa.