{"id":13170,"date":"2026-09-27T18:25:00","date_gmt":"2026-09-27T16:25:00","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/?p=13170"},"modified":"2026-10-26T12:11:33","modified_gmt":"2026-10-26T11:11:33","slug":"tutorial-odczyt-zminifikowanego-skryptu-obcego-zanim-trafi-na-strone","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/pl\/tworzenie-stron-internetowych\/tutorials-pl-tworzenie-stron-internetowych\/tutorial-odczyt-zminifikowanego-skryptu-obcego-zanim-trafi-na-strone\/","title":{"rendered":"Tutorial: Odczyt zminifikowanego skryptu obcego, zanim trafi na stron\u0119"},"content":{"rendered":"<p>Skrypt zewn\u0119trzny uruchomiony bezpo\u015brednio na stronie mo\u017ce korzysta\u0107 z DOM-u i wielu interfejs\u00f3w przegl\u0105darki z uprawnieniami tej strony. DOM to reprezentacja strony w przegl\u0105darce, obejmuj\u0105ca tekst, formularze i inne elementy. Nadal obowi\u0105zuj\u0105 granice przegl\u0105darki: ramki z innych origin\u00f3w, ciasteczka HttpOnly i interfejsy wymagaj\u0105ce uprawnie\u0144 nie staj\u0105 si\u0119 automatycznie dost\u0119pne. Przegl\u0105d musi wi\u0119c ustali\u0107 rzeczywisty kontekst integracji.<\/p>\n<p>Formatowanie i wyszukiwanie s\u0142\u00f3w kluczowych pomagaj\u0105 przy pierwszej kontroli. Sze\u015b\u0107 przeszuka\u0144 nie opisuje jednak wszystkich mo\u017cliwo\u015bci, nie dowodzi nieszkodliwo\u015bci i nie zast\u0119puje przegl\u0105du bezpiecze\u0144stwa. Przydatny wynik to zapis dowod\u00f3w: dok\u0142adny plik, potencjalne funkcje, zaobserwowane zachowanie, wymagane cele i otwarte pytania.<\/p>\n<h2>Odtwarzalna kopia przed analiz\u0105<\/h2>\n<p>Poni\u017cszy przyk\u0142ad Bash wymaga curl, sha256sum oraz ju\u017c zainstalowanej, zatwierdzonej wersji js-beautify. Zarezerwowany adres przyk\u0142adowy wymaga zast\u0105pienia rzeczywistym adresem dostawcy. Osobny katalog przegl\u0105du zachowuje ka\u017cd\u0105 kopi\u0119 z dat\u0105. Pobieranie zapisuje nag\u0142\u00f3wki i ko\u0144cowy URL, odrzuca b\u0142\u0119dy HTTP i dopuszcza tylko przekierowania HTTPS. Pobrany skrypt nie jest wykonywany.<\/p>\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"bash\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Shell<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-bash\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-keyword\">set<\/span> <span class=\"cbb-attr\">-eu<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">curl<\/span> <span class=\"cbb-attr\">--fail<\/span> <span class=\"cbb-attr\">--show-error<\/span> <span class=\"cbb-attr\">--silent<\/span> <span class=\"cbb-attr\">--location<\/span>   \\\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">--proto<\/span> <span class=\"cbb-string\">'=https'<\/span> <span class=\"cbb-attr\">--proto-redir<\/span> <span class=\"cbb-string\">'=https'<\/span>   \\\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">--connect-timeout<\/span> <span class=\"cbb-number\">10<\/span> <span class=\"cbb-attr\">--max-time<\/span> <span class=\"cbb-number\">60<\/span>   \\\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">--dump-header<\/span> widget.headers.txt   \\\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">--write-out<\/span> <span class=\"cbb-string\">'%{url_effective}\\n'<\/span>   \\\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">--output<\/span> widget.raw.js \\\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-string\">'https:\/\/cdn.vendor.example\/widget.js'<\/span> <span class=\"cbb-operator\">&gt;<\/span> widget.final-url.txt\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">test<\/span> <span class=\"cbb-attr\">-s<\/span> widget.raw.js\n<\/span><span class=\"cbb-line\">sha256sum widget.raw.js <span class=\"cbb-operator\">&gt;<\/span> widget.sha256\n<\/span><span class=\"cbb-line\">js-beautify <span class=\"cbb-attr\">--version<\/span>\n<\/span><span class=\"cbb-line\">js-beautify widget.raw.js <span class=\"cbb-attr\">-o<\/span> widget.pretty.js<\/span><\/code><\/pre><\/figure>\n<p>Nawet udane pobranie wymaga sprawdzenia tre\u015bci i Content-Type: strona logowania HTML ze statusem 200 nie jest oczekiwanym JavaScriptem. Wersja narz\u0119dzia formatuj\u0105cego i czas pobrania nale\u017c\u0105 do dokumentacji. Podstaw\u0105 sum kontrolnych pozostaj\u0105 niezmienione bajty; sformatowana kopia s\u0142u\u017cy czytaniu. R\u00f3\u017cnica rozmiaru nie jest miar\u0105 bezpiecze\u0144stwa ani wiarygodnym pomiarem kompresji transmisji.<\/p>\n<p>Formatowanie nie odtwarza nazw, komentarzy ani struktury \u017ar\u00f3de\u0142 usuni\u0119tych podczas budowania. Mapy \u017ar\u00f3de\u0142 przypisuj\u0105 miejsca w dostarczonym pliku do oryginalnego kodu. Dost\u0119pne mapy mog\u0105 u\u0142atwi\u0107 analiz\u0119, lecz musz\u0105 odpowiada\u0107 dostarczonemu plikowi. DevTools pozwala te\u017c zapisa\u0107 tre\u015b\u0107 odpowiedzi i wyeksportowa\u0107 zapis sieciowy, wi\u0119c kontrola w przegl\u0105darce mo\u017ce by\u0107 udokumentowana. Zapisane adresy i dane \u017c\u0105da\u0144 mog\u0105 wymaga\u0107 oczyszczenia przed udost\u0119pnieniem.<\/p>\n<h2>Sze\u015b\u0107 przeszuka\u0144 potencjalnych funkcji<\/h2>\n<p>Przyk\u0142ady wykrywaj\u0105 niekt\u00f3re cz\u0119ste zapisy. Trafienie mo\u017ce znajdowa\u0107 si\u0119 w komentarzu albo nieu\u017cywanej ga\u0142\u0119zi; brak trafienia nie wyklucza danej mo\u017cliwo\u015bci. Skrypt mo\u017ce wywo\u0142a\u0107 <code>globalThis[\"fe\" + \"tch\"](...)<\/code>, u\u017cy\u0107 aliasu lub wczyta\u0107 inny plik. Sze\u015b\u0107 kategorii porz\u0105dkuje prac\u0119, a nie certyfikuje skrypt.<\/p>\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"bash\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Shell<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-bash\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-comment\"># Network-related candidates<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">grep<\/span> <span class=\"cbb-attr\">-nE<\/span> <span class=\"cbb-string\">'fetch&#91;&#91;:space:&#93;&#93;*\\(|XMLHttpRequest|sendBeacon|WebSocket|EventSource|new&#91;&#91;:space:&#93;&#93;+Image'<\/span> widget.pretty.js\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"># Storage and cookie candidates<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">grep<\/span> <span class=\"cbb-attr\">-nE<\/span> <span class=\"cbb-string\">'localStorage|sessionStorage|cookie|indexedDB|caches'<\/span> widget.pretty.js\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"># Additional code or resource loading<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">grep<\/span> <span class=\"cbb-attr\">-nE<\/span> <span class=\"cbb-string\">'createElement|import&#91;&#91;:space:&#93;&#93;*\\(|importScripts|Worker|\\.src&#91;&#91;:space:&#93;&#93;*='<\/span> widget.pretty.js\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"># Input and form handling<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">grep<\/span> <span class=\"cbb-attr\">-nE<\/span> <span class=\"cbb-string\">'addEventListener|oninput|onkeydown|onsubmit|FormData|\\.value'<\/span> widget.pretty.js\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"># Device and rendering features<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">grep<\/span> <span class=\"cbb-attr\">-nE<\/span> <span class=\"cbb-string\">'getContext|toDataURL|AudioContext|hardwareConcurrency|RTCPeerConnection'<\/span> widget.pretty.js\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"># Literal HTTP(S) host candidates only<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">grep<\/span> <span class=\"cbb-attr\">-oiE<\/span> <span class=\"cbb-string\">'https?:\/\/&#91;a-z0-9.-&#93;+'<\/span> widget.pretty.js <span class=\"cbb-operator\">|<\/span> <span class=\"cbb-function\">sort<\/span> <span class=\"cbb-attr\">-u<\/span><\/span><\/code><\/pre><\/figure>\n<p>Wyszukiwanie pami\u0119ci nie odr\u00f3\u017cnia odczytu od zapisu. Pami\u0119\u0107 sesyjna nie oznacza przechowywania bez ko\u0144ca. Obs\u0142uga wej\u015bcia wymaga sprawdzenia rzeczywistego elementu, delegowania zdarze\u0144, odczytywanych warto\u015bci i p\u00f3\u017aniejszej transmisji. Samo u\u017cycie canvas, audio lub WebRTC nie dowodzi fingerprintingu: mo\u017cliwe s\u0105 r\u00f3wnie\u017c testy funkcji i prawid\u0142owe renderowanie. O ustaleniu rozstrzygaj\u0105 cel i przep\u0142yw danych.<\/p>\n<p>O zgodzie nie rozstrzyga samo po\u0142\u0105czenie \u201ezapis i transmisja\u201d. Odczyt informacji z urz\u0105dzenia mo\u017ce mie\u0107 znaczenie bez nowego ciasteczka. Skrypt bez trafie\u0144 s\u0142\u00f3w kluczowych nie jest automatycznie nieszkodliw\u0105 pomoc\u0105 w renderowaniu. Cel, operacje dost\u0119pu i zapisu, dane osobowe oraz maj\u0105ce zastosowanie wyj\u0105tki wymagaj\u0105 osobnej oceny. Wytyczne EROD opisuj\u0105 zakres techniczny szerszy ni\u017c tradycyjne ciasteczka.<\/p>\n<figure class=\"lw-diagram\"><img src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/dia-13170-thirdparty-20261025.png\" width=\"1120\" height=\"580\" loading=\"lazy\" decoding=\"async\" alt=\"Cztery uzupe\u0142niaj\u0105ce kontrole: zachowane \u017ar\u00f3d\u0142o, izolowane testy dzia\u0142ania, regu\u0142y zasob\u00f3w CSP i integralno\u015b\u0107.\"><figcaption>Trafienia s\u0105 tropami do analizy. \u017badna pojedyncza kontrola nie okre\u015bla ca\u0142ego przysz\u0142ego zachowania skryptu.<\/figcaption><\/figure>\n<h2>Minifikacja i zaciemnianie<\/h2>\n<p>Minifikacja zmniejsza kod, np. przez usuwanie odst\u0119p\u00f3w i skracanie nazw wewn\u0119trznych, a zaciemnianie ma utrudnia\u0107 jego zrozumienie. Tablice kodowanych ci\u0105g\u00f3w, obliczane nazwy w\u0142a\u015bciwo\u015bci i dynamiczne generowanie kodu s\u0105 tropami do analizy, nie dowodem szkodliwego zamiaru. Dekodowanie Base64 przez <code>atob<\/code> ma prawid\u0142owe zastosowania niezwi\u0105zane z obrazami. Z kolei obliczany dost\u0119p do w\u0142a\u015bciwo\u015bci mo\u017ce omin\u0105\u0107 proste wyszukiwanie bez rozbudowanego zaciemniania.<\/p>\n<figure style=\"--cbb-digits:1\" class=\"cbb cbb--wrap wp-block-code-beautifier-block-code\" data-lang=\"bash\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Shell<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-bash\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-function\">grep<\/span> <span class=\"cbb-attr\">-nE<\/span> <span class=\"cbb-string\">'eval&#91;&#91;:space:&#93;&#93;*\\(|Function&#91;&#91;:space:&#93;&#93;*\\(|atob&#91;&#91;:space:&#93;&#93;*\\(|String\\.fromCharCode|\\\\x&#91;0-9a-fA-F&#93;{2}'<\/span> widget.pretty.js<\/span><\/code><\/pre><\/figure>\n<p>Zaciemniony kod nadal mo\u017ce podlega\u0107 analizie przez dekodowanie, mapy \u017ar\u00f3de\u0142 lub specjalistyczn\u0105 analiz\u0119 statyczn\u0105. Izolowany test dzia\u0142ania dostarcza innego rodzaju dowod\u00f3w, ale wy\u0142\u0105cznie dla wykonanych \u015bcie\u017cek. Strona testowa powinna zawiera\u0107 dane syntetyczne i nie korzysta\u0107 z aktywnych kont produkcyjnych. Nieznany kod nie powinien trafia\u0107 do zwyk\u0142ej zalogowanej przegl\u0105darki ani na witryn\u0119 produkcyjn\u0105 tylko w celu obserwacji zachowania.<\/p>\n<h2>Lista host\u00f3w nie tworzy automatycznie polityki CSP<\/h2>\n<p>Wyra\u017cenie host\u00f3w powy\u017cej celowo znajduje tylko proste, dos\u0142owne prefiksy HTTP(S). Pomija adresy wzgl\u0119dne, adresy bez podanego protoko\u0142u, WebSockety, kodowane ci\u0105gi i cele sk\u0142adane dynamicznie; usuwa te\u017c informacj\u0119 o porcie. Komentarze i adresy dokumentacji mog\u0105 dawa\u0107 nieistotne trafienia. Content Security Policy (CSP) okre\u015bla dozwolone \u017ar\u00f3d\u0142a skrypt\u00f3w, po\u0142\u0105cze\u0144 i innych zasob\u00f3w przegl\u0105darki. U\u017cyteczny wykaz cel\u00f3w \u0142\u0105czy kontekst kodu, rzeczywiste \u017c\u0105dania, przekierowania i dokumentacj\u0119 dostawcy.<\/p>\n<p>Typ zasobu okre\u015bla dyrektyw\u0119 CSP: \u0142adowanie skryptu, po\u0142\u0105czenia API i pobieranie obraz\u00f3w to r\u00f3\u017cne operacje. Sam host w tek\u015bcie nie uzasadnia dopuszczenia hosta. Poni\u017cszy przyk\u0142ad trybu raportowania przedstawia ma\u0142\u0105 fikcyjn\u0105 witryn\u0119. Domeny i odbiornik raport\u00f3w s\u0105 zast\u0119pcze; pe\u0142na polityka aplikacji wymaga w\u0142asnego przegl\u0105du.<\/p>\n<figure style=\"--cbb-digits:1\" class=\"cbb cbb--wrap wp-block-code-beautifier-block-code\" data-lang=\"plain\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Text<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-plain\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\">Reporting-Endpoints: csp=\"https:\/\/reports.site.example\/csp\"\n<\/span><span class=\"cbb-line\">Content-Security-Policy-Report-Only: default-src 'self'; script-src 'self' https:\/\/cdn.vendor.example; connect-src 'self' https:\/\/api.vendor.example; img-src 'self' https:\/\/images.vendor.example; report-to csp<\/span><\/code><\/pre><\/figure>\n<p>Ka\u017cdy nag\u0142\u00f3wek zajmuje jedn\u0105 lini\u0119 nag\u0142\u00f3wka HTTP. Punkt odbioru raport\u00f3w musi rzeczywi\u015bcie istnie\u0107. Report-Only obserwuje naruszenia bez blokowania. Raporty zale\u017c\u0105 od obs\u0142ugi w przegl\u0105darce, dostarczenia i wykonanych \u015bcie\u017cek. Brak zg\u0142osze\u0144 nie dowodzi kompletno\u015bci, a sta\u0142y tydzie\u0144 nie obejmuje wszystkich warunk\u00f3w. Obserwacja konsoli i sieci nadal nale\u017cy do testu.<\/p>\n<p>Lista dozwolonych host\u00f3w nie przypina tre\u015bci pliku. Kolejny skrypt z ju\u017c dopuszczonego hosta mo\u017ce za\u0142adowa\u0107 si\u0119 bez nowego wpisu. Przy zaufaniu opartym na nonce lub hashu i <code>'strict-dynamic'<\/code> obs\u0142uguj\u0105ce mechanizm przegl\u0105darki mog\u0105 r\u00f3wnie\u017c dopuszcza\u0107 dynamicznie \u0142adowane zale\u017cno\u015bci bez osobnych wpis\u00f3w host\u00f3w. CSP nie zamyka wi\u0119c ka\u017cdej luki pozostawionej przez niezmieniony skrypt \u0142aduj\u0105cy.<\/p>\n<h2>SRI przypina sprawdzone bajty<\/h2>\n<p>Dla odpowiedniej stabilnej odpowiedzi skryptu Subresource Integrity por\u00f3wnuje bajty z oczekiwanym hashem przed wykonaniem. Hash musi pochodzi\u0107 ze sprawdzonego, niezmienionego pliku, a nie ze sformatowanej kopii. Ten przyk\u0142ad Pythona wypisuje rzeczywist\u0105 warto\u015b\u0107 integralno\u015bci SHA-384:<\/p>\n<figure style=\"--cbb-digits:1\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"python\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Python<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-python\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-keyword\">import<\/span> base64\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">import<\/span> hashlib\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">from<\/span> pathlib <span class=\"cbb-keyword\">import<\/span> Path\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">raw = <span class=\"cbb-function\">Path<\/span>(<span class=\"cbb-string\">\"widget.raw.js\"<\/span>).<span class=\"cbb-function\">read_bytes<\/span>()\n<\/span><span class=\"cbb-line\">digest = base64.<span class=\"cbb-function\">b64encode<\/span>(hashlib.<span class=\"cbb-function\">sha384<\/span>(raw).<span class=\"cbb-function\">digest<\/span>()).<span class=\"cbb-function\">decode<\/span>(<span class=\"cbb-string\">\"ascii\"<\/span>)\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">print<\/span>(<span class=\"cbb-string\">\"sha384-\"<\/span> + digest)<\/span><\/code><\/pre><\/figure>\n<p>Pe\u0142ny wynik zast\u0119puje poni\u017cszy tekst zast\u0119pczy. Tekst zast\u0119pczy celowo nie jest prawid\u0142owym hashem do wdro\u017cenia.<\/p>\n<figure style=\"--cbb-digits:1\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"html\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">HTML<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-html\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-punct\">&lt;<\/span><span class=\"cbb-tag\">script<\/span> <span class=\"cbb-attr\">src<\/span><span class=\"cbb-punct\">=<\/span><span class=\"cbb-string\">\"https:\/\/cdn.vendor.example\/widget.js\"<\/span>\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">integrity<\/span><span class=\"cbb-punct\">=<\/span><span class=\"cbb-string\">\"sha384-REPLACE_WITH_REVIEWED_BASE64_DIGEST\"<\/span>\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">crossorigin<\/span><span class=\"cbb-punct\">=<\/span><span class=\"cbb-string\">\"anonymous\"<\/span><span class=\"cbb-punct\">&gt;<\/span><span class=\"cbb-punct\">&lt;\/<\/span><span class=\"cbb-tag\">script<\/span><span class=\"cbb-punct\">&gt;<\/span><\/span><\/code><\/pre><\/figure>\n<p>Inna odpowied\u017a nie przechodzi sprawdzenia integralno\u015bci. Aplikacja potrzebuje okre\u015blonego zachowania przy takim b\u0142\u0119dzie; automatyczne przyj\u0119cie aktualnego hasha dostawcy nie by\u0142oby ponownym przegl\u0105dem. SRI mi\u0119dzy r\u00f3\u017cnymi originami wymaga te\u017c odpowiedniej odpowiedzi CORS. <code>crossorigin=\"anonymous\"<\/code> stosuje CORS z trybem po\u015bwiadcze\u0144 same-origin: po\u015bwiadczenia s\u0105 pomijane dla innego originu, lecz nadal mog\u0105 by\u0107 wysy\u0142ane dla tego samego.<\/p>\n<p>Zmienny kontener tag\u00f3w nie jest z zasady niezgodny z hashowaniem. W praktyce dynamiczne lub spersonalizowane odpowiedzi, brak obs\u0142ugi CORS i cz\u0119ste publikacje mog\u0105 sprawi\u0107, \u017ce stabilne wdro\u017cenie SRI jest nieodpowiednie albo nieobs\u0142ugiwane przez dostawc\u0119. Bez przypi\u0119cia potrzebne pozostaj\u0105 kontrola publikacji, sprawdzone wersje i monitoring. \u017baden z tych mechanizm\u00f3w nie zatwierdza dowolnego przysz\u0142ego kodu.<\/p>\n<div class=\"lw-faq\">\n<h2>Pytania i odpowiedzi<\/h2>\n<h3>Czy hash skryptu \u0142aduj\u0105cego obejmuje wszystkie zale\u017cno\u015bci?<\/h3>\n<p>Nie. Hash elementu script obejmuje zas\u00f3b pobrany dla tego elementu, a nie wszystkie p\u00f3\u017aniej \u0142adowane skrypty lub odpowiedzi konfiguracyjne. Dynamicznie tworzony skrypt mo\u017ce otrzyma\u0107 w\u0142asne metadane integralno\u015bci, je\u015bli skrypt \u0142aduj\u0105cy to obs\u0142uguje. W pozosta\u0142ych przypadkach ka\u017cda zale\u017cno\u015b\u0107 wymaga osobnej oceny; dozwolony host nie gwarantuje integralno\u015bci.<\/p>\n<h3>Czy niezmieniony cotygodniowy hash dowodzi tego samego zachowania?<\/h3>\n<p>Nie. Identyczne bajty mog\u0105 zachowywa\u0107 si\u0119 inaczej przez zdaln\u0105 konfiguracj\u0119, czas, lokalizacj\u0119, zgod\u0119, stan konta lub zmienione zale\u017cno\u015bci. Zmieniony hash jest sygna\u0142em do przegl\u0105du, a nie werdyktem. Cz\u0119stotliwo\u015b\u0107 por\u00f3wna\u0144 powinna odpowiada\u0107 procesowi aktualizacji i ryzyku integracji, a testy dzia\u0142ania obejmowa\u0107 istotne warunki.<\/p>\n<h3>Co obejmuje przegl\u0105d aktualizacji?<\/h3>\n<ol><li>Nowa niezmieniona kopia wraz z dowodami pobrania, obok poprzednio zaakceptowanej wersji.<\/li><li>Por\u00f3wnanie kodu, potencjalnych cel\u00f3w i zale\u017cno\u015bci w kontek\u015bcie; zmiana minifikacji mo\u017ce utrudni\u0107 por\u00f3wnanie wierszy.<\/li><li>Izolowane testy odpowiednich stron, stan\u00f3w zgody i interakcji, z obserwacj\u0105 sieci oraz pami\u0119ci.<\/li><li>Udokumentowana decyzja dotycz\u0105ca ka\u017cdego nowego celu lub funkcji przed zmian\u0105 CSP albo zaakceptowanej warto\u015bci integralno\u015bci.<\/li><\/ol>\n<p>Wykorzystania danych na serwerze, retencji i dalszego udost\u0119pniania nie da si\u0119 ustali\u0107 wy\u0142\u0105cznie z kodu przegl\u0105darki. Potrzebne s\u0105 dowody dostawcy i odpowiednia dokumentacja umowna. Przegl\u0105d techniczny precyzuje pytania, ale nie weryfikuje samodzielnie ca\u0142ego \u0142a\u0144cucha przetwarzania dostawcy.<\/p>\n<\/div>\n<div class=\"lw-quellen\"><h2>\u0179r\u00f3d\u0142a<\/h2><ul><li><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\">MDN: dokumentacja JavaScript<\/a><\/li><li><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Operators\/Property_accessors\">MDN: dost\u0119p do w\u0142a\u015bciwo\u015bci JavaScript<\/a><\/li><li><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Security\/Defenses\/Same-origin_policy\">MDN: zasady tego samego originu<\/a><\/li><li><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Document\/cookie\">MDN: Document.cookie<\/a><\/li><li><a href=\"https:\/\/developer.chrome.com\/docs\/devtools\/javascript\/source-maps\">Chrome DevTools: diagnoza kodu oryginalnego z mapami \u017ar\u00f3de\u0142<\/a><\/li><li><a href=\"https:\/\/developer.chrome.com\/docs\/devtools\/network\/reference\">Chrome DevTools: funkcje panelu sieciowego<\/a><\/li><li><a href=\"https:\/\/github.com\/beautifier\/js-beautify\">js-beautify: dokumentacja projektu i wiersz polece\u0144<\/a><\/li><li><a href=\"https:\/\/curl.se\/docs\/manpage.html\">curl: podr\u0119cznik wiersza polece\u0144<\/a><\/li><li><a href=\"https:\/\/www.edpb.europa.eu\/system\/files\/2024-10\/edpb_guidelines_202302_technical_scope_art_53_eprivacydirective_v2_en_0.pdf\">EROD: wytyczne 2\/2023 o zakresie technicznym art. 5 ust. 3, wersja 2.0<\/a><\/li><li><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTTP\/Reference\/Headers\/Content-Security-Policy\/script-src\">MDN: Content-Security-Policy script-src<\/a><\/li><li><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTTP\/Reference\/Headers\/Content-Security-Policy-Report-Only\">MDN: Content-Security-Policy-Report-Only<\/a><\/li><li><a href=\"https:\/\/www.w3.org\/TR\/CSP3\/\">W3C: Content Security Policy poziom 3<\/a><\/li><li><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Security\/Defenses\/Subresource_Integrity\">MDN: Subresource Integrity<\/a><\/li><li><a href=\"https:\/\/www.w3.org\/TR\/sri\/\">W3C: Subresource Integrity<\/a><\/li><li><a href=\"https:\/\/html.spec.whatwg.org\/multipage\/urls-and-fetching.html#cors-settings-attributes\">WHATWG HTML: atrybuty ustawie\u0144 CORS<\/a><\/li><\/ul><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Uporz\u0105dkowana analiza \u0142\u0105czy zachowane pliki \u017ar\u00f3d\u0142owe, wyszukiwanie, izolowane testy dzia\u0142ania, regu\u0142y CSP i kontrol\u0119 integralno\u015bci. Trafienia wskazuj\u0105 kierunek dalszej analizy; brak trafienia nie dowodzi braku funkcji.<\/p>\n","protected":false},"author":1,"featured_media":29420,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[154],"tags":[92271,92238,92283,92077],"class_list":["post-13170","post","type-post","status-publish","format-standard","hentry","category-tutorials-pl-tworzenie-stron-internetowych","tag-javascript-pl","tag-tutorial-pl","tag-web-performance-pl","tag-web-security-pl"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Tutorial: Odczyt zminifikowanego skryptu obcego, zanim trafi na stron\u0119 | Lukas Wojcik<\/title>\n<meta name=\"description\" content=\"Sformatowanie skryptu dostawcy, sze\u015b\u0107 op\u0142acalnych wzorc\u00f3w wyszukiwania, wyci\u0105gni\u0119cie listy host\u00f3w dla CSP i dlaczego przypi\u0119cie zawodzi przy kontenerze.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/tworzenie-stron-internetowych\/tutorials-pl-tworzenie-stron-internetowych\/tutorial-odczyt-zminifikowanego-skryptu-obcego-zanim-trafi-na-strone\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Tutorial: Odczyt zminifikowanego skryptu obcego, zanim trafi na stron\u0119 | Lukas Wojcik\" \/>\n<meta property=\"og:description\" content=\"Sformatowanie skryptu dostawcy, sze\u015b\u0107 op\u0142acalnych wzorc\u00f3w wyszukiwania, wyci\u0105gni\u0119cie listy host\u00f3w dla CSP i dlaczego przypi\u0119cie zawodzi przy kontenerze.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/tworzenie-stron-internetowych\/tutorials-pl-tworzenie-stron-internetowych\/tutorial-odczyt-zminifikowanego-skryptu-obcego-zanim-trafi-na-strone\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-27T16:25:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-26T11:11:33+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/flux-voll-13166-13170.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Lukas Wojcik\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Lukas Wojcik\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/tworzenie-stron-internetowych\\\/tutorials-pl-tworzenie-stron-internetowych\\\/tutorial-odczyt-zminifikowanego-skryptu-obcego-zanim-trafi-na-strone\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/tworzenie-stron-internetowych\\\/tutorials-pl-tworzenie-stron-internetowych\\\/tutorial-odczyt-zminifikowanego-skryptu-obcego-zanim-trafi-na-strone\\\/\"},\"author\":{\"name\":\"Lukas Wojcik\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"Tutorial: Odczyt zminifikowanego skryptu obcego, zanim trafi na stron\u0119\",\"datePublished\":\"2026-09-27T16:25:00+00:00\",\"dateModified\":\"2026-10-26T11:11:33+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/tworzenie-stron-internetowych\\\/tutorials-pl-tworzenie-stron-internetowych\\\/tutorial-odczyt-zminifikowanego-skryptu-obcego-zanim-trafi-na-strone\\\/\"},\"wordCount\":1419,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/tworzenie-stron-internetowych\\\/tutorials-pl-tworzenie-stron-internetowych\\\/tutorial-odczyt-zminifikowanego-skryptu-obcego-zanim-trafi-na-strone\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/flux-voll-13166-13170.png\",\"keywords\":[\"JavaScript\",\"Tutorial\",\"Web Performance\",\"Web Security\"],\"articleSection\":[\"Tutorials\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/tworzenie-stron-internetowych\\\/tutorials-pl-tworzenie-stron-internetowych\\\/tutorial-odczyt-zminifikowanego-skryptu-obcego-zanim-trafi-na-strone\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/tworzenie-stron-internetowych\\\/tutorials-pl-tworzenie-stron-internetowych\\\/tutorial-odczyt-zminifikowanego-skryptu-obcego-zanim-trafi-na-strone\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/tworzenie-stron-internetowych\\\/tutorials-pl-tworzenie-stron-internetowych\\\/tutorial-odczyt-zminifikowanego-skryptu-obcego-zanim-trafi-na-strone\\\/\",\"name\":\"Tutorial: Odczyt zminifikowanego skryptu obcego, zanim trafi na stron\u0119 | Lukas Wojcik\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/tworzenie-stron-internetowych\\\/tutorials-pl-tworzenie-stron-internetowych\\\/tutorial-odczyt-zminifikowanego-skryptu-obcego-zanim-trafi-na-strone\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/tworzenie-stron-internetowych\\\/tutorials-pl-tworzenie-stron-internetowych\\\/tutorial-odczyt-zminifikowanego-skryptu-obcego-zanim-trafi-na-strone\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/flux-voll-13166-13170.png\",\"datePublished\":\"2026-09-27T16:25:00+00:00\",\"dateModified\":\"2026-10-26T11:11:33+00:00\",\"description\":\"Sformatowanie skryptu dostawcy, sze\u015b\u0107 op\u0142acalnych wzorc\u00f3w wyszukiwania, wyci\u0105gni\u0119cie listy host\u00f3w dla CSP i dlaczego przypi\u0119cie zawodzi przy kontenerze.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/tworzenie-stron-internetowych\\\/tutorials-pl-tworzenie-stron-internetowych\\\/tutorial-odczyt-zminifikowanego-skryptu-obcego-zanim-trafi-na-strone\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/tworzenie-stron-internetowych\\\/tutorials-pl-tworzenie-stron-internetowych\\\/tutorial-odczyt-zminifikowanego-skryptu-obcego-zanim-trafi-na-strone\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/tworzenie-stron-internetowych\\\/tutorials-pl-tworzenie-stron-internetowych\\\/tutorial-odczyt-zminifikowanego-skryptu-obcego-zanim-trafi-na-strone\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/flux-voll-13166-13170.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/flux-voll-13166-13170.png\",\"width\":1200,\"height\":630,\"caption\":\"Tutorial: Odczyt zminifikowanego skryptu obcego, zanim trafi na stron\u0119\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/tworzenie-stron-internetowych\\\/tutorials-pl-tworzenie-stron-internetowych\\\/tutorial-odczyt-zminifikowanego-skryptu-obcego-zanim-trafi-na-strone\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tutorial: Odczyt zminifikowanego skryptu obcego, zanim trafi na stron\u0119\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"Lukas Wojcik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"Lukas Wojcik\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Tutorial: Odczyt zminifikowanego skryptu obcego, zanim trafi na stron\u0119 | Lukas Wojcik","description":"Sformatowanie skryptu dostawcy, sze\u015b\u0107 op\u0142acalnych wzorc\u00f3w wyszukiwania, wyci\u0105gni\u0119cie listy host\u00f3w dla CSP i dlaczego przypi\u0119cie zawodzi przy kontenerze.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/pl\/tworzenie-stron-internetowych\/tutorials-pl-tworzenie-stron-internetowych\/tutorial-odczyt-zminifikowanego-skryptu-obcego-zanim-trafi-na-strone\/","og_locale":"en_US","og_type":"article","og_title":"Tutorial: Odczyt zminifikowanego skryptu obcego, zanim trafi na stron\u0119 | Lukas Wojcik","og_description":"Sformatowanie skryptu dostawcy, sze\u015b\u0107 op\u0142acalnych wzorc\u00f3w wyszukiwania, wyci\u0105gni\u0119cie listy host\u00f3w dla CSP i dlaczego przypi\u0119cie zawodzi przy kontenerze.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/tworzenie-stron-internetowych\/tutorials-pl-tworzenie-stron-internetowych\/tutorial-odczyt-zminifikowanego-skryptu-obcego-zanim-trafi-na-strone\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-09-27T16:25:00+00:00","article_modified_time":"2026-10-26T11:11:33+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/flux-voll-13166-13170.png","type":"image\/png"}],"author":"Lukas Wojcik","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Lukas Wojcik","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/tworzenie-stron-internetowych\/tutorials-pl-tworzenie-stron-internetowych\/tutorial-odczyt-zminifikowanego-skryptu-obcego-zanim-trafi-na-strone\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/tworzenie-stron-internetowych\/tutorials-pl-tworzenie-stron-internetowych\/tutorial-odczyt-zminifikowanego-skryptu-obcego-zanim-trafi-na-strone\/"},"author":{"name":"Lukas Wojcik","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"Tutorial: Odczyt zminifikowanego skryptu obcego, zanim trafi na stron\u0119","datePublished":"2026-09-27T16:25:00+00:00","dateModified":"2026-10-26T11:11:33+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/tworzenie-stron-internetowych\/tutorials-pl-tworzenie-stron-internetowych\/tutorial-odczyt-zminifikowanego-skryptu-obcego-zanim-trafi-na-strone\/"},"wordCount":1419,"commentCount":0,"publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/tworzenie-stron-internetowych\/tutorials-pl-tworzenie-stron-internetowych\/tutorial-odczyt-zminifikowanego-skryptu-obcego-zanim-trafi-na-strone\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/flux-voll-13166-13170.png","keywords":["JavaScript","Tutorial","Web Performance","Web Security"],"articleSection":["Tutorials"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/tworzenie-stron-internetowych\/tutorials-pl-tworzenie-stron-internetowych\/tutorial-odczyt-zminifikowanego-skryptu-obcego-zanim-trafi-na-strone\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/tworzenie-stron-internetowych\/tutorials-pl-tworzenie-stron-internetowych\/tutorial-odczyt-zminifikowanego-skryptu-obcego-zanim-trafi-na-strone\/","url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/tworzenie-stron-internetowych\/tutorials-pl-tworzenie-stron-internetowych\/tutorial-odczyt-zminifikowanego-skryptu-obcego-zanim-trafi-na-strone\/","name":"Tutorial: Odczyt zminifikowanego skryptu obcego, zanim trafi na stron\u0119 | Lukas Wojcik","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/tworzenie-stron-internetowych\/tutorials-pl-tworzenie-stron-internetowych\/tutorial-odczyt-zminifikowanego-skryptu-obcego-zanim-trafi-na-strone\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/tworzenie-stron-internetowych\/tutorials-pl-tworzenie-stron-internetowych\/tutorial-odczyt-zminifikowanego-skryptu-obcego-zanim-trafi-na-strone\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/flux-voll-13166-13170.png","datePublished":"2026-09-27T16:25:00+00:00","dateModified":"2026-10-26T11:11:33+00:00","description":"Sformatowanie skryptu dostawcy, sze\u015b\u0107 op\u0142acalnych wzorc\u00f3w wyszukiwania, wyci\u0105gni\u0119cie listy host\u00f3w dla CSP i dlaczego przypi\u0119cie zawodzi przy kontenerze.","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/tworzenie-stron-internetowych\/tutorials-pl-tworzenie-stron-internetowych\/tutorial-odczyt-zminifikowanego-skryptu-obcego-zanim-trafi-na-strone\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/tworzenie-stron-internetowych\/tutorials-pl-tworzenie-stron-internetowych\/tutorial-odczyt-zminifikowanego-skryptu-obcego-zanim-trafi-na-strone\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/tworzenie-stron-internetowych\/tutorials-pl-tworzenie-stron-internetowych\/tutorial-odczyt-zminifikowanego-skryptu-obcego-zanim-trafi-na-strone\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/flux-voll-13166-13170.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/flux-voll-13166-13170.png","width":1200,"height":630,"caption":"Tutorial: Odczyt zminifikowanego skryptu obcego, zanim trafi na stron\u0119"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/tworzenie-stron-internetowych\/tutorials-pl-tworzenie-stron-internetowych\/tutorial-odczyt-zminifikowanego-skryptu-obcego-zanim-trafi-na-strone\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Tutorial: Odczyt zminifikowanego skryptu obcego, zanim trafi na stron\u0119"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"Lukas Wojcik","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"Lukas Wojcik"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/13170","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=13170"}],"version-history":[{"count":6,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/13170\/revisions"}],"predecessor-version":[{"id":26807,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/13170\/revisions\/26807"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/29420"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=13170"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/categories?post=13170"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=13170"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}