Kako CSP funkcioniše
CSP (Content Security Policy) je whitelist-bazirani sistem: server definiše listu dozvojenih izvora za svaki tip resursa. Browser blokira sve što nije eksplicitno dozvoljeno. Ako napadač ubaci XSS script koji učitava kod sa evil.com, a evil.com nije na listi, browser neće izvršiti script.
Anatomija CSP direktiva
Content-Security-Policy:
default-src 'self';
script-src 'self' 'nonce-abc123' https://cdn.jsdelivr.net;
style-src 'self' 'unsafe-inline';
img-src 'self' data: https:;
font-src 'self' https://fonts.gstatic.com;
connect-src 'self' https://api.vasafirma.rs;
frame-ancestors 'none';
base-uri 'self';
form-action 'self'
Ključne direktive
default-src— fallback za sve direktive koje nisu eksplicitno definisanescript-src— koji JS sme da se izvršistyle-src— koji CSS sme da se učitaimg-src— odakle slike smeju da se učitajuconnect-src— koji URL-ovi su dozvoljeni za XHR/fetch/WebSocketframe-ancestors— ko sme da ubaci vaš sajt u iframe (zamena za X-Frame-Options)base-uri— ograničava vrednost<base>tagaform-action— kuda forme smeju da šalju podatke
Zašto 'unsafe-inline' uništava CSP
'unsafe-inline' u script-src dozvoljava sve inline skripte — uključujući one koje je napadač ubacio. Ovo praktično poništava XSS zaštitu CSP-a. Nažalost, mnogi sajti moraju imati inline skripte zbog legacy koda ili analitike.
Rešenje: Nonces
Nonce (number used once) je nasumični token koji server generiše za svaki request i dodaje u CSP header i u svaki legitimni <script> tag:
# Server (Python/Flask):
import secrets
nonce = secrets.token_hex(16)
# CSP header:
script-src 'nonce-{nonce}'
# HTML:
<script nonce="{nonce}">...</script>
Browser izvršava samo skripte čiji nonce odgovara onom u headeru. Napadačev ubačeni script nema nonce i ne izvršava se.
Rešenje: Hashes
Ako imate statičke inline skripte, možete izračunati njihov SHA-256 hash i dodati ga u CSP:
script-src 'sha256-abc123...'
Browser izvršava samo onu skriptu čiji hash odgovara. Menjanje skripte zahteva ažuriranje hasha.
Strict-CSP pristup
Google preporučuje "Strict CSP" koji koristi nonces i 'strict-dynamic':
Content-Security-Policy:
script-src 'nonce-{nonce}' 'strict-dynamic';
object-src 'none';
base-uri 'none'
'strict-dynamic' propagira poverenje nonce-tagged skripti na skripte koje one dinamički učitavaju — rešava problem sa JavaScript modulima koji sami ubrizgavaju skripte u DOM.
CSP Report-Only: Testiranje bez rizika
Pre aktivacije pravog CSP-a, koristite report-only mod koji loguje kršenja ali ne blokira ništa:
Content-Security-Policy-Report-Only: default-src 'self'; report-uri /csp-report
Analizirajte izveštaje nekoliko dana da identifikujete sve legitimne resurse koji bi bili blokirani.
Shieldome Scout detektuje prisustvo CSP headera, analizira da li sadrži nesigurne direktive poput 'unsafe-inline' bez nonce/hash mehanizma, i daje konkretne preporuke za poboljšanje.
Česte greške
script-src *— wildcard koji dozvoljava bilo koji izvor (beskorisno)'unsafe-eval'u script-src (dozvoljavaeval(), otvara napad vektore)- Zaboraviti
frame-ancestors— ne štiti od clickjackinga - Nedostatak
base-uri 'self'— napadač može promeniti base URL i preusmeriti sve relativne linkove - Previše opširna lista u
script-src(koristite nonce umesto liste domena)
Proverite bezbednost vašeg sajta
Profesionalna procena ranjivosti. OWASP Top 10, dark web monitoring, PDF izveštaj za 2–3 radna dana.
Zatražite procenu →