Criteri di protezione e CSP
1) Perché i criteri di sicurezza
Il frontand moderno e l'API dipendono da molte fonti (CDN, analista, PSP, 3DS, chat). Senza regole rigide aumentano i rischi di XSS, clickjecking, fughe di dati e furti di sessioni. I criteri di protezione limitano ciò che è consentito per impostazione predefinita trasferendo il browser nel modello «abilitato solo esplicitamente» (allow-list).
2) Pilastri base
CSP (Content Security Policy) è un «menu» centralizzato di origini e comportamenti JS/CSS/media consentiti.
Trusted Types - Protezione da DON-XSS a livello di tipo.
SRI (Subresource Integrity) - Controllo dell'integrità degli script/stili.
COOP/COEP/CORP - Isolamento rigido dei contesti e delle risorse tra le sorgenti.
Fetch Metadata ('Sec-Fetch') è una soluzione server per filtrare le richieste di siti crociati.
KORS è un criterio per l'accesso tra domini all'API.
I classici titoli sono HSTS, X-Frame-Options/frame-ancestors, Referer-Policy, -Policy, .
3) CSP: base e principi
3. 1 Direttive (chiave)
default-src è un default per le altre direttive.
«script-src» è l'origine JS, nonce/hash, «strict-dynamic», «report-sample».
«style-src» - sorgenti CSS; minimizza'unsafe-inline '.
`img-src`, `font-src`, `media-src`, `object-src` (обычно `none`).
«connect-src» - Query di rete (XHR/fetch/WebSocket).
'frame-src '/' child-src' - Cornici di terze parti (PSP, 3DS).
«frame-ancestors» - chi può incorporare il nostro sito (anti-clickjecking).
«base-uri» - impedisce la sostituzione' <base> '.
«form-action» - in cui è consentito sabmitare i moduli.
«upgrade-insecure-richiesti», «block-all-mixed-content» - Lotta con il mix HTTP/HTTPS.
«report-uri »/« report-to» - dove filtrare le violazioni.
3. 2 Nonce и hash
Approccio nonce: per ogni risposta HTTP, generare il cripto'nonce ', crittografico', agli script inline '<script nonce ='... 'e à script-src'... ".
Approccio hash: hash fisso del contenuto di inline. Adatto per HTML statico, scomodo quando dinamica.
«strict-dynamic» - Fidarsi solo degli script caricati con lo script «affidabile» (con nonce/hash). Elimina la necessità di elencare i domini di destinazione durante l'avvio dinamico, ma richiede browser modern.
3. 3 Proibizione'unsafe- '
Evitare «unsafe-inline», «unsafe-eval». Se il framework richiede un eval (ad esempio, source-map in dave), includerlo solo per le dive.
Per gli stili, usare «nonce» o «hash», se possibile, senza inline.
3. 4 Esempio di CSP rigoroso (punto di riferimento)
Content-Security-Policy:
default-src 'none';
base-uri 'self';
object-src 'none';
script-src 'self' 'nonce-{RANDOM}' 'strict-dynamic' https://www. googletagmanager. com;
style-src 'self' 'nonce-{RANDOM}';
img-src 'self' data: https://images. example-cdn. com;
font-src 'self' https://fonts. gstatic. com;
connect-src 'self' https://api. example. com wss://ws. example. com;
frame-src https://3ds. psp. com https://pay. psp. com;
frame-ancestors 'none';
form-action 'self' https://pay. psp. com;
upgrade-insecure-requests;
report-to csp-endpoint; report-sample
4) Trusted Types (DOM-XSS)
Attivare la direttiva "Content-Security-Policy: richiere-trusted-types-for" script "; trusted-types app default`.
Creare un unico criterio nel codice ('window. trustedTypes. createPolicy('app', { createHTML() {... } })`).
Vietare le assegnazioni non sicure ('element. innerHTML =...`) без Trusted Types.
Integrazione con frame (React/Angula/Vide) - Utilizzare le API di rendering sicure ed evitare i dangerouslySetInnerHTML pericolosi.
5) SRI (integrità CDN)
Per gli esterni «<script> »/« <link>» usa «integrity =» sha256- «... crossorigin =» anonymous «».
SRI completa invece di sostituire CSP. Quando si aggiorna la versione CDN, aggiornare l'hash.
6) Clickjecking e cornici
Il metodo moderno è «frame-ancestors» (sostituisce l'antiquato «X-Frame-Options»).