{"id":4749,"date":"2026-08-11T20:58:54","date_gmt":"2026-08-11T18:58:54","guid":{"rendered":"https:\/\/www.sycope.com\/?post_type=dictionary-item&#038;p=4749"},"modified":"2026-08-11T21:38:47","modified_gmt":"2026-08-11T19:38:47","slug":"content-security-policy-csp","status":"publish","type":"dictionary-item","link":"https:\/\/www.sycope.com\/pl\/post\/dictionary-item\/content-security-policy-csp","title":{"rendered":"Content Security Policy (CSP)"},"content":{"rendered":"<p><strong>Content Security Policy (CSP)<\/strong> to mechanizm bezpiecze\u0144stwa przegl\u0105darki, kt\u00f3ry m\u00f3wi jej, z jakich miejsc wolno na danej stronie \u0142adowa\u0107 i uruchamia\u0107 zasoby \u2014 skrypty, style, obrazy, czcionki, ramki czy po\u0142\u0105czenia sieciowe. Polityk\u0119 przekazuje si\u0119 nag\u0142\u00f3wkiem HTTP <code>Content-Security-Policy<\/code> (albo znacznikiem <code>&lt;meta&gt;<\/code>). Sk\u0142ada si\u0119 ona z dyrektyw oddzielonych \u015brednikami; ka\u017cda dyrektywa ma nazw\u0119 i list\u0119 dozwolonych \u017ar\u00f3de\u0142. CSP to przede wszystkim warstwa obrony przed atakami typu <a href=\"https:\/\/www.sycope.com\/pl\/post\/dictionary-item\/xss-cross-site-scripting\">cross-site scripting<\/a> (XSS, czyli wstrzykiwanie obcego kodu na stron\u0119) oraz \u2014 dzi\u0119ki dyrektywie <code>frame-ancestors<\/code> \u2014 przed clickjackingiem.<\/p>\n<h2>Jak dzia\u0142a Content Security Policy?<\/h2>\n<p>Serwer dok\u0142ada nag\u0142\u00f3wek <code>Content-Security-Policy<\/code> do odpowiedzi HTTP. Przegl\u0105darka czyta t\u0119 polityk\u0119 i przy ka\u017cdej pr\u00f3bie pobrania zasobu lub uruchomienia kodu sprawdza, czy \u017ar\u00f3d\u0142o jest na li\u015bcie dozwolonych. Je\u015bli nie \u2014 blokuje zas\u00f3b i (opcjonalnie) wysy\u0142a raport o naruszeniu. W\u0142\u0105czona polityka domy\u015blnie blokuje te\u017c skrypty osadzone bezpo\u015brednio w stronie (<code>&lt;script&gt;...&lt;\/script&gt;<\/code>, atrybuty <code>onclick<\/code>, adresy <code>javascript:<\/code>) oraz dynamiczne uruchamianie kodu (<code>eval()<\/code>, <code>Function()<\/code>, <code>setTimeout<\/code>\/<code>setInterval<\/code> z tekstem zamiast funkcji), o ile czego\u015b z tego jawnie nie dopu\u015bcimy.<\/p>\n<p>Polityk\u0119 egzekwuje przegl\u0105darka po stronie u\u017cytkownika, ale to serwer decyduje o jej tre\u015bci. Wa\u017cne, by nag\u0142\u00f3wek szed\u0142 przy <strong>ka\u017cdej<\/strong> odpowiedzi HTML, a nie tylko na stronie g\u0142\u00f3wnej.<\/p>\n<h2>Jak dostarcza si\u0119 polityk\u0119 CSP?<\/h2>\n<ul>\n<li><strong>Nag\u0142\u00f3wek <\/strong><strong><code>Content-Security-Policy<\/code><\/strong> \u2014 metoda zalecana, obs\u0142uguje wszystkie funkcje (m.in. <code>frame-ancestors<\/code> i raportowanie).<\/li>\n<li><strong>Nag\u0142\u00f3wek <\/strong><strong><code>Content-Security-Policy-Report-Only<\/code><\/strong> \u2014 polityka nie blokuje niczego, ale zg\u0142asza naruszenia. S\u0142u\u017cy do test\u00f3w przed wdro\u017ceniem.<\/li>\n<li><strong>Znacznik <\/strong><strong><code>&lt;meta http-equiv=\"Content-Security-Policy\"&gt;<\/code><\/strong> \u2014 dzia\u0142a tylko cz\u0119\u015b\u0107 funkcji (nie ma m.in. <code>frame-ancestors<\/code> ani raportowania); bywa przydatny w aplikacjach renderowanych po stronie przegl\u0105darki.<\/li>\n<\/ul>\n<p>Lepiej omija\u0107 przestarza\u0142e nag\u0142\u00f3wki <code>X-Content-Security-Policy<\/code> i <code>X-Webkit-CSP<\/code>.<\/p>\n<h2>Jakie s\u0105 najwa\u017cniejsze dyrektywy CSP?<\/h2>\n<p>Dyrektywy dziel\u0105 si\u0119 na kilka grup. Najcz\u0119\u015bciej spotykane to dyrektywy pobierania (fetch directives), kt\u00f3re ograniczaj\u0105 \u017ar\u00f3d\u0142a konkretnych typ\u00f3w zasob\u00f3w:<\/p>\n<ul>\n<li><code>default-src<\/code> \u2014 domy\u015blna polityka, warto\u015b\u0107 zapasowa dla pozosta\u0142ych dyrektyw pobierania.<\/li>\n<li><code>script-src<\/code> \u2014 dozwolone \u017ar\u00f3d\u0142a JavaScriptu (najwa\u017cniejsza w obronie przed XSS).<\/li>\n<li><code>style-src<\/code> \u2014 \u017ar\u00f3d\u0142a arkuszy styl\u00f3w.<\/li>\n<li><code>img-src<\/code>, <code>font-src<\/code>, <code>media-src<\/code> \u2014 obrazy, czcionki, audio\/wideo.<\/li>\n<li><code>connect-src<\/code> \u2014 po\u0142\u0105czenia: <code>fetch()<\/code>, <code>XMLHttpRequest<\/code>, WebSocket, EventSource.<\/li>\n<li><code>object-src<\/code> \u2014 wtyczki (<code>&lt;object&gt;<\/code>, <code>&lt;embed&gt;<\/code>); zalecana warto\u015b\u0107 to <code>'none'<\/code>.<\/li>\n<li><code>frame-src<\/code>, <code>worker-src<\/code>, <code>manifest-src<\/code> \u2014 ramki, workery, manifest aplikacji.<\/li>\n<\/ul>\n<p>Pozosta\u0142e grupy to dyrektywy dokumentu (<code>base-uri<\/code>, <code>sandbox<\/code>), dyrektywy nawigacji (<code>form-action<\/code>, <code>frame-ancestors<\/code>), dyrektywy raportowania (<code>report-to<\/code>, <code>report-uri<\/code>) oraz dyrektywa wymuszaj\u0105ca bezpieczny transport (<code>upgrade-insecure-requests<\/code>).<\/p>\n<h2>Jakie s\u0105 s\u0142owa kluczowe listy \u017ar\u00f3de\u0142?<\/h2>\n<ul>\n<li><code>'self'<\/code> \u2014 zasoby z tej samej domeny (origin).<\/li>\n<li><code>'none'<\/code> \u2014 ca\u0142kowity zakaz \u0142adowania danego typu zasobu.<\/li>\n<li><code>https:<\/code>, <code>data:<\/code> \u2014 dozwolony schemat (np. wszystko po <a href=\"https:\/\/www.sycope.com\/pl\/post\/dictionary-item\/http-https\">HTTPS<\/a> albo data URI).<\/li>\n<li>nazwa hosta lub wildcard, np. <code>*.example.com<\/code>.<\/li>\n<li><code>'unsafe-inline'<\/code> \u2014 dopuszcza skrypty i style osadzone w stronie (os\u0142abia ochron\u0119, niezalecane).<\/li>\n<li><code>'unsafe-eval'<\/code> \u2014 dopuszcza <code>eval()<\/code> i pokrewne (niezalecane).<\/li>\n<li><code>'nonce-...'<\/code> \u2014 jednorazowy, losowy token przepuszczaj\u0105cy konkretny skrypt osadzony w stronie.<\/li>\n<li><code>'sha256-...'<\/code> \/ <code>'sha384-...'<\/code> \/ <code>'sha512-...'<\/code> \u2014 hasz przepuszczaj\u0105cy skrypt lub styl o dok\u0142adnie tej zawarto\u015bci.<\/li>\n<li><code>'strict-dynamic'<\/code> \u2014 zaufanie nadane skryptowi przez nonce lub hasz przenosi na skrypty, kt\u00f3re ten skrypt sam za\u0142aduje; ignoruje listy host\u00f3w oraz <code>'unsafe-inline'<\/code>.<\/li>\n<\/ul>\n<h2>Czym jest strict CSP oparte na nonce i haszach?<\/h2>\n<p>Listy dozwolonych host\u00f3w trudno utrzyma\u0107 i cz\u0119sto da si\u0119 je obej\u015b\u0107 (np. przez otwarte przekierowania albo hostowane biblioteki podatne na JSONP). Wsp\u00f3\u0142czesna, zalecana praktyka to <strong>strict CSP<\/strong> oparte na nonce lub haszach:<\/p>\n<ul>\n<li><strong>Nonce<\/strong> \u2014 serwer przy ka\u017cdej odpowiedzi generuje losowy token, wstawia go do nag\u0142\u00f3wka (<code>script-src 'nonce-RANDOM'<\/code>) oraz do atrybutu <code>nonce<\/code> zaufanych tag\u00f3w <code>&lt;script&gt;<\/code>. Token musi by\u0107 inny przy ka\u017cdej odpowiedzi i nie do przewidzenia. Wymaga dynamicznego renderowania szablonu.<\/li>\n<li><strong>Hasz<\/strong> \u2014 w polityce umieszcza si\u0119 zakodowany Base64 skr\u00f3t SHA-256\/384\/512 tre\u015bci skryptu. Przegl\u0105darka liczy skr\u00f3t zawarto\u015bci i \u0142aduje zas\u00f3b tylko przy zgodno\u015bci. Dobre dla tre\u015bci statycznej; ka\u017cda zmiana, nawet spacji, uniewa\u017cnia hasz.<\/li>\n<li><strong><code>'strict-dynamic'<\/code><\/strong> \u2014 pozwala skryptowi dopuszczonemu przez nonce lub hasz \u0142adowa\u0107 kolejne skrypty bez oznaczania ka\u017cdego z osobna; u\u0142atwia podpi\u0119cie bibliotek zewn\u0119trznych.<\/li>\n<\/ul>\n<p>Typowa restrykcyjna polityka \u0142\u0105czy te elementy z ograniczeniami: <code>script-src 'nonce-RANDOM' 'strict-dynamic'; object-src 'none'; base-uri 'none'<\/code>.<\/p>\n<h2>Jak CSP chroni przed XSS i clickjackingiem?<\/h2>\n<p>Przy XSS CSP dzia\u0142a jak <strong>druga warstwa obrony<\/strong>: nawet je\u015bli atakuj\u0105cy zdo\u0142a wstrzykn\u0105\u0107 kod, restrykcyjna polityka nie pozwoli go uruchomi\u0107, bo wstrzykni\u0119ty skrypt nie zna wa\u017cnego nonce ani nie pasuje do \u017cadnego hasza. To jednak nie zast\u0119puje sprawdzania danych wej\u015bciowych i bezpiecznego kodowania danych na wyj\u015bciu po stronie serwera \u2014 CSP to obrona w g\u0142\u0105b (<em>defense in depth<\/em>), a nie jedyne zabezpieczenie.<\/p>\n<p>Przy clickjackingu dyrektywa <code>frame-ancestors<\/code> decyduje, kto mo\u017ce osadzi\u0107 stron\u0119 w ramce (<code>'none'<\/code>, <code>'self'<\/code> albo konkretne domeny). Zast\u0119puje ona starszy nag\u0142\u00f3wek <code>X-Frame-Options<\/code>. Dyrektywa <code>base-uri 'none'<\/code> blokuje podmian\u0119 znacznika <code>&lt;base&gt;<\/code>, a <code>upgrade-insecure-requests<\/code> wymusza HTTPS dla zasob\u00f3w (to uzupe\u0142nienie, a nie zamiennik nag\u0142\u00f3wka HSTS).<\/p>\n<h2>Jak dzia\u0142a raportowanie narusze\u0144 CSP?<\/h2>\n<p>CSP mo\u017ce zg\u0142asza\u0107 ka\u017cde naruszenie, wi\u0119c bywa \u017ar\u00f3d\u0142em telemetrii bezpiecze\u0144stwa przydatnej zespo\u0142om <a href=\"https:\/\/www.sycope.com\/pl\/post\/dictionary-item\/soc-security-operations-center\">SOC<\/a> i przy monitoringu aplikacji.<\/p>\n<ul>\n<li><strong>Reporting <a href=\"https:\/\/www.sycope.com\/pl\/post\/dictionary-item\/api\">API<\/a> (aktualne)<\/strong> \u2014 adresy zg\u0142osze\u0144 podaje nag\u0142\u00f3wek <code>Reporting-Endpoints<\/code>, a polityka wskazuje grup\u0119 przez <code>report-to nazwa-grupy<\/code>. Raport to JSON z polem <code>type: \"csp-violation\"<\/code> i szczeg\u00f3\u0142ami (<code>blockedURL<\/code>, <code>effectiveDirective<\/code>, <code>documentURL<\/code>, <code>disposition<\/code> itd.).<\/li>\n<li><strong><code>report-uri<\/code><\/strong><strong> (przestarza\u0142e)<\/strong> \u2014 wysy\u0142a raport metod\u0105 POST na podany URL (<code>Content-Type: application\/csp-report<\/code>). Dla zgodno\u015bci ze starszymi przegl\u0105darkami warto poda\u0107 obie dyrektywy: nowsze u\u017cyj\u0105 <code>report-to<\/code>, starsze <code>report-uri<\/code>.<\/li>\n<\/ul>\n<p>Z perspektywy wykrywania zagro\u017ce\u0144 strumie\u0144 raport\u00f3w CSP pozwala wcze\u015bnie zauwa\u017cy\u0107 pr\u00f3by wstrzykni\u0119cia skrypt\u00f3w, \u0142adowanie zasob\u00f3w z nieautoryzowanych domen (np. <a href=\"https:\/\/www.sycope.com\/pl\/post\/dictionary-item\/data-exfiltration-wyciek-danych\">wyciek danych<\/a> przez wstrzykni\u0119ty cel w <code>connect-src<\/code>) czy b\u0142\u0119dy konfiguracji. Tryb <code>Content-Security-Policy-Report-Only<\/code> pozwala obserwowa\u0107 takie zdarzenia bez blokowania ruchu \u2014 przydaje si\u0119 przy strojeniu polityki i ocenie wp\u0142ywu nowej wersji.<\/p>\n<h2>Jak wdro\u017cy\u0107 CSP bez psucia aplikacji?<\/h2>\n<ol>\n<li>Uruchom polityk\u0119 w trybie <code>Content-Security-Policy-Report-Only<\/code> i zbieraj raporty narusze\u0144.<\/li>\n<li>Posprz\u0105taj kod osadzony w stronie: przenie\u015b skrypty do osobnych plik\u00f3w, zamie\u0144 atrybuty zdarze\u0144 (<code>onclick<\/code>) na <code>addEventListener<\/code>.<\/li>\n<li>Dodaj nonce lub hasze do zaufanych skrypt\u00f3w; dla bibliotek zewn\u0119trznych rozwa\u017c <code>'strict-dynamic'<\/code>.<\/li>\n<li>Domknij polityk\u0119 ograniczeniami: <code>object-src 'none'<\/code>, <code>base-uri 'none'<\/code>, <code>frame-ancestors<\/code>.<\/li>\n<li>Prze\u0142\u0105cz na egzekwowany <code>Content-Security-Policy<\/code>, dalej obserwuj\u0105c raporty.<\/li>\n<\/ol>\n<h2>Dowiedz si\u0119 wi\u0119cej<\/h2>\n<ul>\n<li><a href=\"https:\/\/www.sycope.com\/pl\/post\/dictionary-item\/cloud-access-security-broker-casb\">Cloud Access Security Broker (CASB)<\/a> \u2014 CASB wspiera egzekwowanie polityk bezpiecze\u0144stwa w ruchu do us\u0142ug chmurowych, podobnie jak CSP.<\/li>\n<li><a href=\"https:\/\/www.sycope.com\/pl\/post\/dictionary-item\/cloud-security-posture-management-cspm\">Cloud Security Posture Management (CSPM)<\/a> \u2014 CSPM kontroluje konfiguracj\u0119 chmury, a CSP ogranicza zagro\u017cenia po stronie tre\u015bci i zasob\u00f3w przegl\u0105darki.<\/li>\n<li><a href=\"https:\/\/www.sycope.com\/pl\/post\/dictionary-item\/saas-security-posture-management\">SaaS Security Posture Management (SSPM)<\/a> \u2014 SSPM ocenia bezpiecze\u0144stwo aplikacji SaaS, kt\u00f3re CSP mo\u017ce dodatkowo chroni\u0107 przez restrykcje \u0142adowanych zasob\u00f3w.<\/li>\n<\/ul>\n","protected":false},"featured_media":0,"template":"","class_list":["post-4749","dictionary-item","type-dictionary-item","status-publish","hentry"],"acf":{"tytul":"Content Security Policy (CSP)","ikona":"","krotki_opis":"Mechanizm bezpiecze\u0144stwa przegl\u0105darki sterowany nag\u0142\u00f3wkiem HTTP, kt\u00f3ry ogranicza, sk\u0105d strona mo\u017ce \u0142adowa\u0107 skrypty i inne zasoby \u2014 g\u0142\u00f3wnie po to, by utrudni\u0107 ataki XSS."},"_links":{"self":[{"href":"https:\/\/www.sycope.com\/pl\/wp-json\/wp\/v2\/dictionary-item\/4749","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sycope.com\/pl\/wp-json\/wp\/v2\/dictionary-item"}],"about":[{"href":"https:\/\/www.sycope.com\/pl\/wp-json\/wp\/v2\/types\/dictionary-item"}],"wp:attachment":[{"href":"https:\/\/www.sycope.com\/pl\/wp-json\/wp\/v2\/media?parent=4749"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}