XSS w React: dangerouslySetInnerHTML i skrypty zewnętrzne
Poznają Państwo, jak domyślne escapowanie w React zapobiega XSS, kiedy dangerouslySetInnerHTML jest niebezpieczne oraz jak skrypty zewnętrzne wprowadzają ryzyko.
XSS w React: dangerouslySetInnerHTML i skrypty zewnętrzne to bezpłatna lekcja React Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej React Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs React Academy zawiera 4 lekcji w sumie.
Wbudowana ochrona React przed XSS
React automatycznie escapuje wszystkie wartości renderowane przez JSX przed wstawieniem ich do DOM. Gdy w JSX zapisują Państwo {userInput}, React wykonuje operację równoważną przypisaniu do textContent — wartość jest traktowana jako tekst, nigdy jako HTML. Domyślnie zapobiega to większości ataków XSS w aplikacjach React.
Działanie dangerouslySetInnerHTML
dangerouslySetInnerHTML={{ __html: htmlString }} to mechanizm Reacta omijający automatyczne escapowanie. Nazwa celowo brzmi alarmująco: informuje, że biorą Państwo odpowiedzialność za bezpieczeństwo ciągu HTML. React bezpośrednio ustawia innerHTML, interpretując dowolny HTML, w tym skrypty i procedury obsługi zdarzeń.
Uzasadnione zastosowania
Rzeczywiście potrzebują Państwo dangerouslySetInnerHTML, gdy renderują HTML pochodzący z edytora tekstu sformatowanego (takiego jak TipTap lub Quill), systemu CMS przechowującego HTML albo konwertera Markdown na HTML. Źródła te generują prawdziwe znaczniki HTML, które muszą zostać wyrenderowane jako HTML, a nie jako escapowany tekst.
Wektor ataku
Jeśli ciąg HTML zawiera <script>stealCookies()</script> lub <img src=x onerror="stealData()">, ustawienie go jako innerHTML powoduje wykonanie kodu atakującego. Każda treść pochodząca od użytkownika, przekazana bezpośrednio do dangerouslySetInnerHTML bez sanityzacji, stanowi krytyczną lukę XSS.
DOMPurify: standardowy sanityzator
DOMPurify to standardowy w branży sanityzator HTML dla przeglądarek. Analizuje ciąg HTML w izolowanym kontekście, usuwa niebezpieczne elementy i atrybuty (znaczniki skryptów, procedury obsługi zdarzeń, adresy URL javascript:) oraz zwraca bezpieczny ciąg HTML. Należy użyć DOMPurify.sanitize(dirtyHtml) przed przekazaniem danych do dangerouslySetInnerHTML.
Zagrożenia związane ze skryptami stron trzecich
Skrypty stron trzecich (analityka, widżety czatu, sieci reklamowe) działają z takimi samymi uprawnieniami jak kod JavaScript aplikacji. Przejęty lub złośliwy skrypt strony trzeciej może odczytać document.cookie, uzyskać dostęp do localStorage, odczytać dane wprowadzane do formularzy i wysyłać żądania do zewnętrznych serwerów — bez żadnego sygnału dla użytkownika.
Content Security Policy jako warstwa ochrony
Content Security Policy to nagłówek HTTP określający, które skrypty mogą być wykonywane. Nawet jeśli ładunek XSS zostanie wstrzyknięty do DOM, prawidłowo skonfigurowana CSP może zablokować jego wykonanie, ograniczając skrypty wbudowane i zezwalając wyłącznie na skrypty z dozwolonych źródeł. CSP stanowi drugą linię obrony po sanityzacji danych wejściowych.
Ataki na łańcuch dostaw za pośrednictwem npm
Pakiety npm stanowią rzeczywisty wektor ataków XSS. Zależność może zawierać złośliwy kod, który wykrada zmienne środowiskowe lub dane użytkowników. Incydent związany z node-ipc z 2022 roku oraz przejęcie ua-parser-js z 2021 roku pokazały, że powszechnie używane pakiety mogą zostać przejęte i zatrute. Należy przeprowadzać audyt zależności za pomocą npm audit i używać plików blokad.
Co atakujący mogą zrobić za pomocą XSS
Udany atak XSS umożliwia atakującemu kradzież tokenu JWT użytkownika z sessionStorage (wysłanie go na serwer kontrolowany przez atakującego), wykonywanie działań jako uwierzytelniony użytkownik (wywoływanie API z użyciem jego sesji), modyfikowanie DOM w celu wyświetlania treści phishingowych lub rejestrowanie każdego naciśnięcia klawisza w aplikacji.
Interfejs API Trusted Types
Przeglądarkowy interfejs API Trusted Types wymaga, aby wszystkie ujścia DOM (innerHTML, eval, script.src) otrzymywały specjalne obiekty określonego typu zamiast surowych ciągów. Zapobiega to docieraniu ładunków XSS opartych na ciągach do DOM na poziomie platformy. React zmierza do zgodności z Trusted Types, a CSP może ją wymuszać.
Bezpieczne wzorce dla treści CMS
Bezpieczny wzorzec renderowania HTML z CMS wygląda następująco: należy pobrać HTML, przekazać go przez DOMPurify.sanitize() z listą dozwolonych bezpiecznych znaczników i atrybutów, a następnie wyrenderować za pomocą dangerouslySetInnerHTML={{ __html: cleanHtml }}. Nie wolno pomijać etapu sanityzacji, nawet jeśli ufają Państwo systemowi CMS, ponieważ sama baza danych CMS może zostać przejęta.
Zastosowanie DOMPurify
Co robi DOMPurify po wywołaniu DOMPurify.sanitize(htmlString)?
Podsumowanie lekcji
React automatycznie escapuje wartości JSX, zapobiegając większości ataków XSS. dangerouslySetInnerHTML omija tę ochronę na potrzeby uzasadnionego renderowania HTML — dane wejściowe należy zawsze najpierw oczyścić za pomocą DOMPurify. Skrypty stron trzecich i przejęte pakiety npm stanowią wektory ataków XSS w łańcuchu dostaw. Content Security Policy zapewnia drugą warstwę ochrony. Udany atak XSS umożliwia kradzież tokenów, podszywanie się pod użytkownika i phishing.
Często zadawane pytania
Czy lekcja „XSS w React: dangerouslySetInnerHTML i skrypty zewnętrzne” jest bezpłatna?
Tak — pełny tekst „XSS w React: dangerouslySetInnerHTML i skrypty zewnętrzne” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu React Academy, przejdź na CoddyKit PRO. Kurs React Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „XSS w React: dangerouslySetInnerHTML i skrypty zewnętrzne”?
Poznają Państwo, jak domyślne escapowanie w React zapobiega XSS, kiedy dangerouslySetInnerHTML jest niebezpieczne oraz jak skrypty zewnętrzne wprowadzają ryzyko. Ćwiczysz React Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć React Academy?
Nie wymagamy żadnego doświadczenia. React Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „XSS w React: dangerouslySetInnerHTML i skrypty zewnętrzne”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji React Academy?
Tak. Każda lekcja React Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- XSS w React: dangerouslySetInnerHTML i skrypty zewnętrzne
- Ochrona przed CSRF w konfiguracjach React i API
- Content Security Policy dla aplikacji React
- Zarządzanie sekretami i zmiennymi środowiskowymi