Rodzaje ataków XSS: Różnice, przykłady oraz skuteczne metody ochrony

przez Autor

Poznaj rodzaje ataków XSS, ich różnice oraz sprawdzone sposoby ochrony przed Cross-site Scripting. Zapobiegnij zagrożeniom w aplikacjach webowych!

Spis treści

Czym jest XSS? Definicja i znaczenie ataków Cross-site Scripting

Ataki XSS (Cross-site Scripting) to jeden z najczęściej występujących i najniebezpieczniejszych typów luk bezpieczeństwa w aplikacjach webowych. Atak XSS polega na wstrzyknięciu złośliwego kodu, najczęściej w języku JavaScript, do strony internetowej, która następnie jest wyświetlana innym użytkownikom. Co istotne, kod ten zostaje wykonany przez przeglądarkę ofiary w kontekście danej strony, przez co uzyskuje dostęp do jej ciasteczek, tokenów uwierzytelniających lub innych poufnych informacji. Luka pojawia się zwykle wtedy, gdy aplikacja internetowa niepoprawnie filtruje i przetwarza dane wejściowe użytkownika, przez co pozwala na umieszczenie niebezpiecznych skryptów w generowanym kodzie HTML. Zainfekowane fragmenty interfejsu — takie jak formularze, komentarze czy dynamiczne podsumowania — stają się narzędziem cyberprzestępców, którzy mogą np. wykradać dane, przejmować konta lub wykonywać działania nieautoryzowane w imieniu prawowitego użytkownika. Dlatego ataki XSS są szczególnie groźne dla serwisów społecznościowych, forów dyskusyjnych, paneli użytkownika i innych rozbudowanych systemów, gdzie interakcja pomiędzy użytkownikami oraz funkcjonalność generowania dynamicznych treści są standardem.

Znaczenie ataków XSS ma kluczowe znaczenie dla bezpieczeństwa zarówno użytkowników, jak i właścicieli serwisów internetowych. Oznacza to, że nawet pozornie niewinna luka tego typu może prowadzić do poważnych konsekwencji biznesowych i wizerunkowych dla firmy. Skutkiem skutecznego ataku XSS mogą być między innymi kradzież danych osobowych, przejęcie sesji użytkownika, podmiana treści stron czy też rozsyłanie złośliwego oprogramowania wśród użytkowników danego serwisu. W niektórych przypadkach cyberprzestępca jest w stanie naruszyć całą infrastrukturę aplikacji albo zainstalować backdoory umożliwiające kolejne włamania. Obecność podatności XSS wpływa negatywnie także na kwestie zgodności z regulacjami prawnymi dotyczącymi ochrony danych osobowych, takimi jak RODO. Dlatego współczesne standardy i praktyki programistyczne każą przywiązywać dużą wagę do odpowiedniego filtrowania, walidacji oraz ucieczki znaków wprowadzanych przez użytkownika już na najwcześniejszym etapie tworzenia systemu informatycznego. Zrozumienie mechanizmu działania XSS oraz jego potencjalnych skutków pozwala lepiej zabezpieczać aplikacje webowe przed atakami oraz budować świadomość zarówno wśród deweloperów, jak i użytkowników końcowych korzystających z internetu każdego dnia.

Trzy główne typy ataków XSS: Reflected, Stored i DOM-Based

W świecie bezpieczeństwa aplikacji webowych wyróżnia się trzy główne typy ataków XSS: Reflected (odblaskowy), Stored (trwały) oraz DOM-Based (oparty na manipulacji Document Object Model). Różnią się one zarówno w sposobie działania, jak i potencjalnych konsekwencjach. Atak Reflected XSS polega na tym, że złośliwy kod zostaje przesłany do serwera w żądaniu użytkownika, najczęściej przez adres URL lub formularz, i natychmiast „odbijany” w odpowiedzi serwera do przeglądarki. W praktyce oznacza to, że przestępca musi nakłonić ofiarę do kliknięcia specjalnie przygotowanego linku lub przesłać odpowiednio sfałszowane żądanie. Kod nie jest przechowywany na serwerze, dzięki czemu odkrycie tego typu ataku bywa trudniejsze, a zagrożenie często dotyczy pojedynczego użytkownika w danym momencie. Typowe scenariusze obejmują rozsyłanie phishingowych e-maili lub publikację szkodliwych odnośników. Przykładowo, użytkownik otrzymuje link o treści: https://sklep.example.com/search?q=<script>alert('XSS')</script>, a jeśli aplikacja nie filtruje parametrów wejściowych, kod zostanie wykonany w przeglądarce po wejściu na stronę wyników wyszukiwania.

Stored XSS, zwany również trwałym, jest potencjalnie najgroźniejszy, gdyż złośliwy skrypt zostaje zapisany w bazie danych lub innym magazynie po stronie serwera. Ofiara nie musi nawet wykonywać żadnej akcji poza odwiedzeniem zainfekowanej strony. Tego typu atak często wykorzystywany jest na forach dyskusyjnych, stronach z komentarzami, serwisach społecznościowych czy platformach blogowych. Przestępca wprowadza szkodliwy kod jako część publikowanego wpisu, komentarza lub profilu użytkownika. Po zapisaniu do bazy, każda osoba odwiedzająca dany zasób automatycznie pobiera i wykonuje tę treść w swojej przeglądarce. Przykład: cyberprzestępca publikuje komentarz pod postem, a zamieszczony w nim skrypt kradnie ciasteczka sesyjne wszystkich odwiedzających, przesyłając je na adres wskazanego serwera. Najważniejszą różnicą w stosunku do Reflected XSS jest tu trwałość ataku i znacznie większa skala zagrożenia – każda kolejna ofiara odwiedzająca dany zasób narażona jest na taki sam kod. Z kolei atak DOM-Based XSS różni się tym, że złośliwy kod nie jest przetwarzany po stronie serwera, lecz cała jego obsługa odbywa się po stronie klienta – poprzez manipulację strukturą DOM w przeglądarce użytkownika. Najczęściej dotyczy to dynamicznie generowanych funkcji JavaScript, które nieprawidłowo wykorzystują dane pobrane z parametrów URL, fragmentów hash lub lokalnych zasobów. Przykładem może być aplikacja, która pobiera wartość z window.location.hash i bezpiecznie wstawia ją do wewnętrznego HTML. Jeśli nie zostanie przeprowadzona właściwa walidacja i oczyszczenie tych danych, użytkownik, który kliknie odpowiedni link, może nieświadomie uruchomić szkodliwy skrypt na własnym urządzeniu. Tego typu luka często bywa pomijana podczas testów, gdyż nie wymaga bezpośredniego kontaktu z serwerem, a jej wykrycie wymaga analizy kodu front-endowego i zrozumienia przepływu w aplikacji. Skuteczność wszystkich rodzajów XSS zależy od braku odpowiednich zabezpieczeń: niewłaściwego filtrowania i encodowania danych wejściowych, braku tzw. Content Security Policy oraz niskiej świadomości w zakresie bezpiecznego kodowania po stronie deweloperów. Każdy z opisanych typów stanowi odmienny wektor ataku i wymaga indywidualnego podejścia podczas projektowania zabezpieczeń, co podkreśla konieczność kompleksowego podejścia do ochrony aplikacji webowych.


Rodzaje ataków XSS typy, ochrona i różnice skutecznych metod

Reflected XSS – mechanizm działania i przykłady zagrożeń

Reflected XSS, czyli atak typu odblaskowego, należy do najczęściej spotykanych form Cross-site Scripting i polega na natychmiastowym odbiciu złośliwego kodu przez serwer aplikacji bez jego wcześniejszego trwałego zapisania. Mechanizm działania reflected XSS opiera się na tym, że nieprawidłowo przetworzone dane wejściowe dostarczone przez użytkownika – np. parametry w adresie URL, dane przesyłane metodą POST lub informacje w nagłówkach HTTP – są w niezmodyfikowanej formie umieszczane w odpowiedzi HTML generowanej przez serwer. Atakujący konstruuje specjalny link, który zawiera spreparowany fragment kodu JavaScript, po czym nakłania ofiarę do jego otwarcia, na przykład wysyłając wiadomość email, SMS, korzystając z mediów społecznościowych czy nawet komentując na blogu. Po kliknięciu w taki odnośnik, przeglądarka ofiary wysyła żądanie do serwera, a aplikacja, nie filtrując podanych parametrów, „odbieje” złośliwy skrypt i osadzi go w odpowiedzi HTML. W efekcie skrypt uruchamia się w kontekście przeglądarki użytkownika, co otwiera drzwi do różnych nadużyć, takich jak przejęcie sesji, pobranie poufnych informacji, wykonywanie poleceń w imieniu ofiary czy podmiana treści strony. W odróżnieniu od Stored XSS, reflected XSS wymaga aktywnego udziału użytkownika i nie pozostawia trwałych śladów po stronie serwera, przez co jest trudniejszy do wykrycia i mniej podatny na automatyczne analizy bezpieczeństwa – szczególnie jeśli użytkownicy rzadko klikają podejrzane linki lub aplikacja korzysta z dynamicznych parametrów wejściowych.

Typowym przykładem reflected XSS jest sytuacja, w której strona wyświetla na stronie komunikaty lub dane na podstawie wartości przesłanych w URL, bez odpowiedniej sanitacji danych. Przykładowo, aplikacja przetwarza taki adres: https://example.com/search?q=Oferta+XSS i wyświetla w nagłówku strony wartość parametru q. Atakujący może zastąpić wartość tego parametru spreparowanym kodem, np.: https://example.com/search?q=<script>alert('XSS')</script>. Jeżeli aplikacja nie filtruje i nie koduje poprawnie danych wejściowych, wówczas kod JavaScript zostanie wykonany w przeglądarce osoby, która otworzy ten odnośnik. W bardziej zaawansowanych atakach reflected XSS wykorzystywany jest do kradzieży ciasteczek sesyjnych (np. poprzez wyprowadzenie zawartości ciasteczek na zewnętrzny serwer pod kontrolą atakującego), nakłaniania użytkownika do wykonania nieautoryzowanych działań lub podmiany interfejsu strony, aby przekonać ofiarę do podania poufnych informacji (np. danych logowania lub numerów kart płatniczych). Reflected XSS jest szczególnie groźny w kontekście systemów bankowych, paneli administracyjnych, aplikacji e-commerce czy wszelkich serwisów obsługujących płatności online, ponieważ szybkie zdobycie autoryzacji może pozwolić atakującemu na błyskawiczne przejęcie konta lub wyprowadzenie środków finansowych. Oprócz zagrożeń związanych z kradzieżą sesji i danych osobowych, reflected XSS może być korzeniem dalszych ataków – np. przekierowań phishingowych, instalacji złośliwego oprogramowania, kampanii spamowych lub wymuszania wpisów na portalach społecznościowych w imieniu ofiary. Warto zaznaczyć, że podatność typu reflected XSS może występować nie tylko w widocznych częściach aplikacji, lecz także w ukrytych API, panelach zarządzania, formularzach kontaktowych, filtrach wyszukiwania czy podstronach z niestandardową funkcjonalnością, które rzadko są poprawnie testowane pod kątem podatności XSS. Liczne przypadki głośnych incydentów bezpieczeństwa (np. ataki na systemy korporacyjne, bankowe czy publiczne serwisy informacyjne) dowodzą, że reflected XSS stanowi realne i często lekceważone zagrożenie zarówno dla prywatnych użytkowników, jak i dużych organizacji, zwłaszcza tam, gdzie rutynowo przetwarzane są niezaufane dane wejściowe bez rygorystycznej walidacji.

Stored XSS – dlaczego są najgroźniejsze dla aplikacji webowych?

Stored XSS, znane również jako trwałe XSS, stanowi najniebezpieczniejszy wariant ataku Cross-site Scripting, z uwagi na mechanikę działania i rozległy zakres potencjalnego kompromisu systemu. W przeciwieństwie do ataków odblaskowych, skrypt w przypadku Stored XSS jest trwale zapisywany po stronie serwera – najczęściej w bazie danych lub innym repozytorium danych, takim jak pliki konfiguracyjne, systemy CMS, bazy komentarzy i forów czy profile użytkowników. Atak polega na tym, że napastnik publikuje złośliwy kod w przeznaczonym do tego polu, np. w komentarzu lub opisie użytkownika, licząc na to, że aplikacja webowa nie filtruje odpowiednio danych wejściowych przed zapisaniem ich do bazy. W momencie wyświetlenia zainfekowanej treści przez innych użytkowników, szkodliwy kod jest wykonywany automatycznie w ich przeglądarkach, bez potrzeby klikania podejrzanego linku czy podejmowania działań przez ofiarę. To powoduje, że atak zyskuje skalę – jedna skuteczna iniekcja pozwala atakującemu dotrzeć do szerokiego grona użytkowników, wykorzystując zaufanie, jakim cieszy się legalna witryna. Zainfekowana treść odbywa się zawsze w kontekście danego serwisu, przez co scenariusze ataków są niezwykle groźne: od kradzieży danych logowania i tokenów, przez przejęcie kont użytkowników, aż po rozprzestrzenianie szkodliwego oprogramowania. Przykłady stored XSS pojawiały się wielokrotnie w historii cyberbezpieczeństwa – olbrzymie platformy społecznościowe czy sklepy internetowe bywały dotknięte podatnościami, które umożliwiały jednym ruchem eksfiltrację wrażliwych informacji należących do tysięcy ofiar.

Źródłem wysokiego stopnia zagrożenia jest również to, iż stored XSS może być wykorzystywane w sposób wysoce zautomatyzowany i trudny do wykrycia w tradycyjnych procesach monitoringu bezpieczeństwa. Atakujący mogą skryptować masowe dodawanie złośliwych komentarzy lub wiadomości, a zainfekowane treści mogą przetrwać w systemie przez długi czas zanim zostaną wykryte i usunięte. Niekontrolowane wykonanie złośliwego JavaScript pozwala na ciche przekierowywanie użytkowników do fałszywych stron logowania (phishing), wykradanie ciasteczek sesyjnych czy modyfikację interfejsu strony, co podważa zaufanie do platformy i może prowadzić do masowych strat finansowych oraz utraty reputacji. Negatywny wpływ stored XSS jest pogłębiony przez fakt, że co raz więcej aplikacji umożliwia użytkownikom publikowanie treści – formularze kontaktowe, czaty, listy produktów czy mechanizmy recenzji to tylko niektóre pola do potencjalnej iniekcji. Ochrona przed tym typem ataku wymaga zastosowania wielowarstwowych technik, takich jak rygorystyczna walidacja i sanitizacja danych wprowadzanych przez użytkowników na wszystkich etapach przetwarzania i prezentacji, korzystanie ze sprawdzonych frameworków oraz wdrożenie polityk Content Security Policy (CSP) blokujących wykonanie niedozwolonych skryptów. Niedostateczna ochrona lub pobieżna implementacja zabezpieczeń pozostawia aplikację otwartą nie tylko na naruszenia prywatności użytkowników, ale i na konsekwencje prawne, zwłaszcza w kontekście przepisów takich jak RODO czy PCI DSS. Ponadto, rozległy charakter i zasięg oddziaływania stored XSS sprawia, że incydenty tego typu mają wymiar krytyczny – pojedyncza podatność może być wykorzystana przez miesiące, zanim zostanie wykryta, a skutki jej nadużycia rzutują negatywnie na cały ekosystem informatyczny danego przedsiębiorstwa, sprzyjając eskalacji ataków na inne usługi powiązane z systemem.

DOM-Based XSS – atak po stronie klienta i jak się przed nim bronić

DOM-Based XSS to jeden z najbardziej zaawansowanych i podstępnych wariantów ataku Cross-site Scripting, który różni się istotnie od odmian odblaskowych czy trwałych. W przypadku DOM-Based XSS, cała manipulacja i wykorzystanie podatności odbywa się wyłącznie po stronie klienta, w obrębie Document Object Model (DOM) przeglądarki, bez jakiejkolwiek interakcji po stronie serwera. Źródłem podatności stają się niewłaściwie przetwarzane lub niezabezpieczone dane dynamiczne – takie jak fragmenty adresu URL (location.hash, location.search), wartości z localStorage, window.name czy inne elementy przechowywane i wykorzystywane w aplikacji JavaScript. Ataku nie da się wykryć wyłącznie analizując ruch sieciowy lub odpowiedzi serwera, ponieważ skrypt atakującego wstrzykiwany jest i uruchamiany całkowicie w kontekście przeglądarki użytkownika. Do przeprowadzenia ataku najczęściej wykorzystywane są luki w kodzie JavaScript, np. bezrefleksyjne przekazywanie wartości z URL do funkcji innerHTML, document.write(), eval() lub innych niebezpiecznych metod, które mogą wygenerować lub wykonać dodatkowy kod. Przykładowy scenariusz może wyglądać następująco: użytkownik otrzymuje link do witryny z zakodowanym fragmentem atakującego, np. example.com/#<script>alert('XSS')</script>. Jeśli aplikacja, analizując część po hash, dynamicznie generuje HTML używając unsafe metody, złośliwy kod zostanie natychmiast wykonany w przeglądarce. Tego typu podatności niezwykle trudno wykryć przy użyciu standardowych narzędzi do testowania backendu, ponieważ nie są one wynikiem działania serwera, lecz konsekwencją nieprawidłowego operowania danymi klienta. Często spotykane są one w aplikacjach typu SPA (Single-Page Applications), które mocno polegają na dynamicznym renderowaniu treści po stronie użytkownika.

Ochrona przed DOM-Based XSS wymaga specyficznego podejścia, skoncentrowanego na rygorystycznej kontroli i walidacji wszystkich danych źródłowych wykorzystywanych w obrębie JavaScript. Kluczowa jest tu świadomość deweloperów, by każda informacja pobierana z dynamicznych źródeł – niezależnie, czy pochodzi z parametrów URL, fragmentów hash, localStorage, cookies czy innych źródeł – była traktowana jako potencjalnie niebezpieczna. Najważniejszą linią obrony jest unikanie bezpośredniego wykorzystywania użytkownikowskich danych w newralgicznych miejscach DOM, szczególnie z funkcjami innerHTML, document.write(), eval(), setTimeout() (ze stringiem) lub setInterval(). Zamiast tego rekomendowane jest używanie bezpiecznych metod modyfikowania DOM, takich jak textContent czy setAttribute – te nie interpretują specjalnych znaków ani nie wykonują kodu. Niezbędnym krokiem jest również wdrażanie tzw. sanitizatorów, czyli bibliotek filtrujących i kodujących potencjalnie groźne fragmenty, np. DOMPurify. Dobrą praktyką jest stworzenie własnych wrapperów do operacji na DOM, które za każdym razem stosują zachowanie bezpieczeństwa. Istotnym elementem zabezpieczenia jest wdrożenie rygorystycznej polityki Content Security Policy (CSP) również dla aplikacji SPA, ograniczających wykonanie nieautoryzowanych skryptów – choć CSP nie eliminuje wszystkich przypadków, skutecznie minimalizuje skutki udanych prób ataku. Regularne testy bezpieczeństwa frontendu – zarówno manualne przez audytorów, jak i automatyczne poprzez narzędzia typu fuzzery DOM, skanery statyczne i dynamiczne kodu JS – pomagają wyłapać nawet te niestandardowe, rzadziej spotykane wektory ataku. Istotne jest także odpowiedzialne korzystanie z frameworków frontendowych, które posiadają wbudowane mechanizmy ochrony, a także eliminowanie przestarzałych bibliotek czy zależności o znanych lukach w bezpieczeństwie. Podsumowując, skuteczna obrona przed DOM-Based XSS to ciągły proces edukacji, wdrażania zasad defensywnego programowania i stosowanie nowoczesnych narzędzi bezpieczeństwa już na etapie projektowania interfejsu aplikacji. Bezpośrednią konsekwencją zaniedbań w tym obszarze może być nie tylko kradzież danych i przejęcie kont użytkowników, ale również kompromitacja całego systemu zaufania między serwisem a jego klientami.

Skuteczne strategie zapobiegania atakom XSS i najlepsze praktyki

Zapobieganie atakom XSS wymaga kompleksowego podejścia obejmującego zarówno działania techniczne, jak i odpowiednie procesy wytwarzania oprogramowania. Najważniejszym filarem ochrony jest rygorystyczne filtrowanie oraz walidacja danych wejściowych po stronie serwera i klienta. Wszystkie dane wprowadzane przez użytkownika – niezależnie od źródła, kanału transmisji czy formatu – powinny być traktowane jako potencjalnie niebezpieczne. Walidacja powinna odnosić się do założonych typów danych, długości, dopuszczalnych znaków oraz spotykanych formatów (na przykład adresów email, numerów telefonów czy dat). Należy unikać wyświetlania niesanitowanych danych we wrażliwych kontekstach HTML, JavaScript czy CSS. Kluczowe znaczenie ma tutaj tzw. escaping, czyli przekształcanie znaków specjalnych na ich bezpieczne odpowiedniki (np. znaków „” na < i >). Używanie dedykowanych funkcji escapingujących dla różnych kontekstów (atrybut HTML, zawartość JavaScript czy wartości wewnątrz tagów XML) znacząco ogranicza ryzyko zainfekowania strony złośliwym kodem. Warto podkreślić konieczność stosowania sprawdzonych bibliotek oraz frameworków webowych, które automatyzują proces bezpiecznego wyświetlania danych i są testowane pod kątem podatności XSS. Popularne frameworki takie jak React, Angular czy Vue domyślnie neutralizują wstrzykiwane kod, co pozwala ograniczyć wiele błędów wynikających z nieuwagi programisty. Podstawą bezpieczeństwa jest także regularny przegląd logiki aplikacji oraz kodu źródłowego w celu identyfikacji i eliminacji miejsc umożliwiających wprowadzanie i wyświetlanie niebezpiecznych treści, szczególnie w dynamicznych częściach systemu, takich jak sekcje komentarzy, formularze czy panele administracyjne.

Nieocenioną rolę w ochronie aplikacji webowych przed XSS odgrywają również zaawansowane mechanizmy bezpieczeństwa oferowane przez przeglądarki i serwery, takie jak Content Security Policy (CSP). CSP pozwala zdefiniować politykę uruchamiania skryptów na stronie, ograniczyć źródła dozwolonych treści oraz zablokować próbę ładowania złośliwego kodu z niezaufanych domen. Wdrożenie CSP, nawet na podstawowym poziomie, zmniejsza skuteczność wielu ataków typu XSS, uniemożliwiając wykonanie nieautoryzowanego skryptu w przeglądarce użytkownika. Dodatkowo, istotne jest stosowanie atrybutów zabezpieczających nagłówki HTTP, takich jak „HttpOnly” i „Secure” dla ciasteczek, co minimalizuje ryzyko przechwycenia sesji przez atakującego. W przypadku aplikacji silnie opartych na JavaScript zaleca się wykorzystanie narzędzi służących do sanitizacji treści, takich jak DOMPurify czy Google Caja, które neutralizują potencjalnie niebezpiecznie fragmenty kodu przed ich wstawieniem do dokumentu HTML. Ważną praktyką organizacyjną jest prowadzenie regularnych testów bezpieczeństwa – zarówno automatycznych (np. przy pomocy narzędzi takich jak OWASP ZAP, Burp Suite), jak i manualnych przeglądów kodu realizowanych przez zespół deweloperski lub niezależnych audytorów. Dzięki temu możliwe jest nie tylko wykrycie nowych luk, lecz także monitorowanie wdrażanych poprawek i dostosowywanie zabezpieczeń do zmieniających się technologii oraz wektorów ataku. Wreszcie, skuteczne strategie ochrony XSS powinny być uzupełnione o szkolenia z zakresu bezpiecznego programowania dla całego zespołu pracującego nad projektem, podnoszenie świadomości dotyczącej najczęstszych podatności oraz ciągłe aktualizowanie komponentów zewnętrznych (bibliotek, pluginów), które mogą wprowadzać nieoczekiwane ryzyka. Tylko połączenie technologicznych środków bezpieczeństwa, systematycznego doskonalenia procesów oraz ciągłej edukacji personelu może skutecznie ograniczyć ryzyko wystąpienia ataków XSS i zabezpieczyć aplikacje internetowe przed ich konsekwencjami.

Podsumowanie

Ataki XSS stanowią poważne zagrożenie dla bezpieczeństwa aplikacji webowych, ponieważ umożliwiają przechwytywanie danych i wykonywanie złośliwego kodu w przeglądarce użytkownika. Zrozumienie różnic między Reflected, Stored i DOM-Based XSS pozwala lepiej identyfikować i minimalizować ryzyko wystąpienia tych ataków. Stosowanie skutecznych strategii zapobiegania i wdrażanie najlepszych praktyk podnosi poziom ochrony serwisów internetowych. Inwestycja w bezpieczeństwo XSS to podstawa budowania zaufania użytkowników i stabilności systemów webowych.

Może Ci się również spodobać

Ta strona używa plików cookie, aby poprawić Twoje doświadczenia. Założymy, że to Ci odpowiada, ale możesz zrezygnować, jeśli chcesz. Akceptuję Czytaj więcej