Kako izgleda dobar skup zaglavlja
strict-transport-security: max-age=31536000; includeSubDomains; preload
content-security-policy: default-src 'none'; script-src 'self'; style-src 'self'; img-src 'self' data:; font-src 'self'; connect-src 'self'; object-src 'none'; base-uri 'none'; form-action 'self'; frame-ancestors 'none'; upgrade-insecure-requests
x-content-type-options: nosniff
x-frame-options: DENY
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=(), payment=()
cross-origin-opener-policy: same-origin
cross-origin-resource-policy: same-origin To je ono što ovaj sajt šalje. Za aplikaciju sa inline skriptama CSP prelazi na nonce vrednosti: script-src 'nonce-<nasumično po odgovoru>' 'strict-dynamic', što je i strože i lakše za održavanje od liste dozvoljenih hostova.
Kako razmišlja CSP procena
CSP postoji da ograniči šta napadač može da uradi kad već pronađe tačku ubacivanja. Zato procena pita: za jedan ubačeni string, mogu li skripte da se izvrše? 'unsafe-inline' bez nonce vrednosti kaže da. Džoker ili izvor po šemi (*, https:, data:) kaže da. Host koji servira skripte koje napadač može da bira (javni CDN-ovi sa starim AngularJS-om, JSONP endpointi na googleapis.com, storage bucketi) kaže da, zbog čega je dugačka lista popularnih CDN-ova slabija nego što izgleda. Nedostajući object-src i base-uri su dve direktive koje ljudi zaboravljaju, a koje ponovo otvaraju vrata. Preostale direktive (frame-ancestors, form-action, default-src) bitne su za clickjacking i izvlačenje podataka, a ne za izvršavanje skripti, pa se ocenjuju niže.
Gde se postavljaju zaglavlja
- nginx:
add_header Name "value" always;— imajte na umu daadd_headerunutarlocationbloka poništava sva zaglavlja na nivou servera (proverite pomoću nginx location testera). - Apache:
Header always set Name "value"u vhostu ili .htaccess (mod_headers). - Cloudflare: HSTS pod SSL/TLS → Edge Certificates; ostala zaglavlja preko Transform Rules → Modify Response Header, što radi i za origin servere koje ne možete da menjate.
- Aplikacioni frejmvorci: helmet (Node), secure_headers (Rails), django-csp, Laravel middleware — oni generišu i nonce po odgovoru.
Bezbedno uvođenje CSP-a
- Šaljite ga kao
Content-Security-Policy-Report-Onlysareport-toendpointom i nedelju dana pratite izveštaje. - Ispravite stvarna kršenja (inline handleri, vidžeti trećih strana), zanemarite šum od ekstenzija pregledača.
- Promenite ime zaglavlja u
Content-Security-Policy. Zadržite report-only za testiranje sledeće izmene.
Pitanja
Koja zaglavlja su najvažnija?
Za sajt sa bilo kakvom interakcijom korisnika: prvo Content-Security-Policy, pa Strict-Transport-Security i X-Content-Type-Options. Politike uokviravanja i referrera je jeftino dodati. Ostalo je higijena: sakrijte verzije, označite kolačiće, uklonite zastarela zaglavlja.
Zašto je moj CSP ocenjen kao slab iako navodi samo pouzdane hostove?
Zato što poverenje nije pitanje; pitanje je da li bilo koja skripta na tim hostovima može da se natera da izvrši napadačev kod. Javni CDN-ovi hostuju hiljade verzija biblioteka, neke sa poznatim gedžetima (AngularJS šabloni, JSONP callbackovi). Politika zasnovana na nonce vrednostima sa strict-dynamic nema taj problem, i ova stranica je ocenjuje kao najjaču postavku.
Da li je X-XSS-Protection još koristan?
Ne. Chrome je uklonio XSS auditor 2019, Edge 2018; Firefox ga nikad nije imao. Zaglavlje je bezopasno kao „0“, a bilo je štetno kao „1; mode=block“ u starim pregledačima. Uklonite ga i koristite CSP.
Kako da dobijem zaglavlja stranice koja preusmerava?
curl -sIL https://example.com/ ispisuje svaki odgovor u lancu. Nalepite sve; poslednji odgovor se ocenjuje, a preusmerenja se navode. Proverite da http:// preusmerava na https:// u jednom skoku.
Da li se ocena poklapa sa securityheaders.com?
Otprilike: oba broje istih šest osnovnih zaglavlja. Ova stranica dodatno procenjuje sadržaj CSP-a, a ne samo njegovo prisustvo, i oduzima za curenja i zastarela zaglavlja, pa sajt sa slabim CSP-om ovde dobija nižu ocenu.