Politici de securitate și CSP
1) De ce avem nevoie de politici de securitate
Interfața modernă și API depind de multe surse (CDN, analytics, PSP, 3DS, chat-uri). Fără politici dure, riscurile de XSS, clickjacking, scurgeri de date și deturnarea sesiunii cresc. Politicile de securitate limitează ceea ce este permis în mod implicit prin mutarea browser-ului la modelul allow-list.
2) Stâlpi de bază
CSP (Content Security Policy) este un „meniu” centralizat al surselor și comportamentelor JS/CSS/media permise.
Tipuri de încredere - protecție de tip împotriva DOM-XSS.
SRI (Subresource Integrity) - controlează integritatea scripturilor/stilurilor.
COOP/COEP/CORP - izolarea rigidă a contextelor și resurselor între surse.
Fetch Metadata („Sec-Fetch-”) este o soluție de server pentru filtrarea cererilor cross-site.
CORS - politica de acces API cross-domain.
Titluri clasice: HSTS, 'X-Frame-Options '/' frame-ancestors',' Referrer-Policy ',' Permissions-Policy ', SameSite-cookies.
3) CSP: Baze și principii
3. 1 Directive (cheie)
"default-src' - implicit pentru alte directive.
"script-src' - surse JS, nonce/hash," strict-dinamic "," raport-eșantion ".
"style-src' - surse CSS; minimiza 'unsafe-inline'.
'img-src', 'font-src', 'media-src', 'object-src' (обычно 'none').
"connect-src' - cereri de rețea (XHR/fetch/WebSocket).
"frame-src "/" child-src' - cadre terțe (PSP, 3DS).
„frame-strămoșii” - care pot încorpora site-ul nostru (anti-clickjacking).
„baze-uri” - interzice substituirea „<base>”.
„acțiune de formă” - în cazul în care formularele sunt permise să fie prezentate.
„cereri upgrade-nesigure”, „bloc-all-mixed-content” - combaterea mixului HTTP/HTTPS.
„report-uri ”/„ report-to” - în cazul în care pentru a trimite încălcări.
3. 2 Nonce и hash
Abordare nonce: genera un cripto-aleatoare "nonce" pentru fiecare răspuns HTTP, adăuga "<script nonce ="... ">" la scripturi inline și "script-src" nonce- "..
Abordare hash: hash fix de conținut inline. Potrivit pentru HTML static, incomod pentru dinamică.
"strict-dinamic": numai scripturile de încredere încărcate de un script' de încredere "(cu nonce/hash). Elimină necesitatea de a lista domeniile țintă în timpul boot-ului dinamic, dar necesită browsere moderne.
3. 3 Interzicerea „unsafe”
Evitați „nesigure-inline”, „nesigure-eval”. Dacă cadrul necesită eval (de exemplu, source-map in dev), includeți numai pe dev.
Pentru stiluri - utilizați „nonce” sau „hash”, dacă este posibil, fără inline.
3. 4 Exemplu de CSP strict (punct de luptă)
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) Tipuri de încredere (DOM-XSS)
Activarea directivei: „Politica de securitate a conținutului: necesită tipuri de încredere pentru” script'; tipuri de încredere app default '.
Creați o politică unică în cod ('fereastră. Tipuri de încredere. CreatePolicy ('app', {createHTML () {...}}) ').
Interzicerea misiunilor nesigure ("element. innerHTML =... ') без Tipuri de încredere.
Integrarea cadrului (React/Angular/Vue): utilizați API-uri de randare securizate, evitați periculosSetInnerHTML.
5) SRI (CDN Integritate)
Pentru extern' <script> '/' <link>', utilizați 'integrity =" sha256-... „crossorigin =” anonim „”.
SRI suplimentează, nu înlocuiește, CSP. Când actualizați o versiune CDN, actualizați hash-ul.
6) Clickjacking și cadre
Modalitatea modernă este „strămoșii cadrelor” (înlocuiește opțiunile învechite „X-Frame-Options”).