CSPscript-src 'self''nonce-xyz'frame-ancestors'none'default-src 'self'<script>

Politica de securitate a conținutului

11 min citireSecuritate

Politica de securitate a conținutului este antetul HTTP care permite paginilor web să declare ceea ce este permis să se încarce și să se execute. Un CSP strict transformă XSS într-un risc mult mai mic: chiar dacă un atacator injectează script, browserul refuză să-l ruleze. Compensația este complexitatea implementării, motiv pentru care CSP este mai puțin adoptat decât ar trebui.

Întregul articol al articolului este oferit în limba engleză mai jos.

Politica de securitate a conținutului (CSP) este un antet de răspuns HTTP (și echivalentul metaetichetei) care spune browserului care origini au permisiunea de a încărca resurse, ce scripturi inline pot rula și unde ar trebui trimise rapoartele privind încălcările. Un CSP bine configurat reduce dramatic impactul vulnerabilităților de injectare; unul prost configurat oferă o încredere falsă cu puțină protecție reală.

Ce controlează CSP-ul

Politica este compusă din directive, fiecare specificând sursele permise pentru un tip de resursă:

  • script-src — sursele JavaScript permise să se încarce execute
  • style-src — surse CSS
  • img-src — surse de imagine
  • connect-src — XHR, preluare, WebSocket targets
  • font-src — surse de fonturi
  • media-src — surse audio și video
  • frame-src — ce poate fi încărcat în iframes
  • frame-ancestors — ce poate încadra această pagină (înlocuiește X-Frame-Options)
  • form-action — unde formularele pot fi trimise
  • XPLZ47 — ceea ce poate fi setat ca URL-uri de bază PLZ47 base
  • upgrade-insecure-requests — upgrade automat HTTP la HTTPS
  • default-src — alternativă pentru directive nespecificate

A pornire rezonabilă politică

Politica-securitate-conținut:
  default-src 'self';
  script-src 'self' 'nonce-randomBase64Value';
  style-src 'self' 'unsafe-inline';
  img-src date „self”: https:;
  connect-src „self” https://api.example.com;
  strămoși-cadru „niciunul”;
  base-uri 'self';
  formă-acțiune „sine”;
  report-uri https://example.com/csp-reports

Această politică spune: în mod implicit, încărcați numai de la aceeași origine, script-urile trebuie să fie de aceeași origine sau să aibă nonce care se potrivește, fără încorporare în cadre iframe de pe alte site-uri etc. nonce.

Nonces vs hashes vs whitelists

Trei moduri de a permite anumite scripturi inline:

  • Nonce-based. Server generează un nou nonce aleatoriu per cerere și îl include pe fiecare script permis în CSP. Strict și dinamic, recomandat pentru noile implementări.
  • Basat pe hash. CSP specifică hash-uri SHA ale scripturilor inline permise. Browserul are scripturi inline și compară. Funcționează pentru scripturi statice al căror conținut nu se modifică.
  • Lista albă a originilor. Permiteți scripturi din anumite domenii externe. Ușor, dar creează suprafețe mari de atac — dacă orice domeniu inclus în lista albă este compromis sau are redirecționări deschise, politica este ocolită. anti-pattern

    Multe site-uri implementează CSP cu unsafe-inline și unsafe-eval în script-src pentru a evita spargerea codului existent. În esență, acesta nu este deloc un CSP - scopul este de a preveni rularea scripturilor inline, iar unsafe-inline elimină această protecție. Site-urile cu această configurație au anteturi CSP fără beneficii CSP.

    Calea către valoarea CSP reală: eliminați unsafe-inline, refactorați codul pentru a utiliza nonces-uri sau hash-uri și rezolvați încălcările una câte una. Dureroasă, dar reală.

    Modul doar pentru rapoarte

    CSP poate fi implementat în modul doar pentru raportare — browserul raportează încălcările unui URI configurat, dar nu le impune. Util pentru testarea unei noi politici împotriva traficului real fără a încălca site-ul:

    Content-Security-Policy-Report-Only: ...

    Lansarea standard: implementați în modul doar raportare, colectați încălcările pentru câteva săptămâni, remediați modul legitim pentru o săptămână. Multe site-uri mari au implementări CSP pe mai multe luni prin acest ciclu de iterație.

    CSP și XSS

    Avantajul titlului: chiar și atunci când injecția XSS reușește, scriptul injectat nu poate rula dacă nu are un nonce valid. Sarcina utilă a atacatorului ajunge în pagină; browserul refuză să-l execute. Vulnerabilitatea este încă prezentă, dar impactul este redus dramatic. Ambele straturi ar trebui să fie prezente.

    Suport browser CSP

    Toate browserele majore din 2016+. Caracteristicile CSP 3 (nonces, strict-dinamic, hash) au suport larg. Lacunele rămase sunt în gestionarea cazurilor marginale — interacțiunea strămoșilor cadru cu X-Frame-Options, comportament variat al raportării-uri față de raportarea către, ciudățenii specifice browser-ului în raportarea erorilor. (analitice, reclame, monitorizare) trebuie să fie incluse în politică sau eșuează

  • IManagerii de evenimente în linie (onclick="...") încalcă CSP, cu excepția cazului în care sunt permise în mod explicit
  • Aplicațiile cu o singură pagină cu conținut dinamic au nevoie de o gestionare atentă neobișnuită în extensiileXPLZ15B uneori în cazul conținutului de extensie
  • X. CSP, care generează zgomot
  • Diferitele echipe pot avea nevoie de fragmente CSP diferite; fuzionarea politicilor nu este banală

Multe site-uri care ar trebui să aibă CSP nu au, deoarece costul operațional se simte mai mare decât beneficiul de securitate perceput. Costul este real; beneficiul este de asemenea real, dar invizibil (nu vezi atacurile care nu au avut loc).

Întrebări frecvente

Este CSP un înlocuitor pentru igienizarea de intrare?
Nu - apărare în profunzime. Igienizarea intrării previne injectarea; CSP împiedică rularea injecției dacă igienizarea eșuează. Ambele ar trebui să fie la locul lor. Să te bazezi doar pe CSP este fragil; bazarea numai pe igienizare a eșuat de două decenii.
Ar trebui să folosesc nonces sau hashes?
Nonces pentru conținut dinamic (cazul comun); hash-uri pentru scripturi inline fixe al căror conținut nu se modifică niciodată. Cele mai multe cadre moderne includ suport nonce în mod nativ. Hashurile sunt mai simple din punct de vedere conceptual, dar devin o povară de întreținere dacă conținutul scriptului se modifică.
De ce este încă obișnuit unsafe-inline?
Cod moștenit care o necesită (biblioteci cu handlere de evenimente inline, cadre mai vechi). Refactorizarea necesită timp. Soluția sinceră este refactorul; scurtătura obișnuită este de a menține unsafe-inline și de a se baza pe alte apărări.
Cum monitorizez încălcările CSP?
Setați report-to sau report-uri la un punct final de colector. Multe platforme de securitate (Cloudflare, Sucuri, custom) acceptă și analizează rapoartele CSP. Traficul din lumea reală generează mult zgomot (extensii de browser, blocare de anunțuri); separarea atacurilor reale de zgomot face parte din volumul de lucru operațional.
Există generatoare de bune practici CSP?
Instrumente precum Evaluatorul CSP de la Google analizează o politică propusă și semnalează punctele slabe. Observatorul Mozilla evaluează paginile inclusiv calitatea CSP. Folosiți-le pentru a audita; ele ajută la evidențierea greșelilor comune, dar nu înlocuiesc înțelegerea politicii.
Politica de securitate a conținutului explicată: antetul HTTP care definește ce poate face pagina dvs