0Pricing
HTML Academy · Lekcja

XSS przez innerHTML i zapobieganie atakom

Poznanie skryptów międzywitrynowych i bezpiecznych alternatyw dla innerHTML

XSS przez innerHTML i zapobieganie atakom to bezpłatna lekcja HTML Academy na CoddyKit. To lekcja 2 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 HTML Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs HTML Academy zawiera 4 lekcji w sumie.

Podstawowa podatność

Przypisanie el.innerHTML = userInput analizuje ciąg znaków jako kod HTML. Jeśli userInput zawiera znaczniki <script> lub atrybuty obsługi zdarzeń (onclick, onerror), przeglądarka je interpretuje i wykonuje kod kontrolowany przez osobę atakującą na stronie.

Dlaczego występuje tak często

Każdy kod, który wstawia dane użytkownika do kodu HTML — szablony serwerowe lub renderowanie po stronie klienta — stwarza ryzyko XSS, jeśli dane nie zostały zabezpieczone przez escapowanie. Aplikacje jednostronicowe budujące innerHTML na podstawie odpowiedzi API są szczególnie narażone, gdy odpowiedzi zawierają treści użytkowników.

Konkretny przykład

Nazwa użytkownika "Bob<img src=x onerror=alert(1)>" ustawiona za pomocą div.innerHTML = `Welcome, ${user}` wywołuje alert(1), gdy obraz img nie może się załadować. Ten sam ładunek jako zwykły tekst (przez textContent) jest nieszkodliwy — przeglądarka widzi tylko znaki, a nie znaczniki.

// VULNERABLE
div.innerHTML = `Hi, ${user.name}`;

// SAFE
div.textContent = `Hi, ${user.name}`;

Do zwykłego tekstu używaj textContent

textContent ustawia wyłącznie tekst — specjalne znaki HTML są wyświetlane jako dosłowne znaki, nigdy jako znaczniki. W 90% przypadków jest to właściwe narzędzie. Po innerHTML należy sięgać tylko wtedy, gdy rzeczywiście trzeba wyrenderować kod HTML, a nie zwykły tekst.

Do tworzenia struktury używaj metod DOM

Aby utworzyć elementy zawierające dane użytkownika, należy zbudować je za pomocą createElement i textContent: const li = document.createElement("li"); li.textContent = name; ul.appendChild(li);. Wynik ma taką samą strukturę jak w przypadku innerHTML, ale z założenia jest bezpieczny względem XSS.

Kiedy trzeba użyć innerHTML

W przypadku zaufanego kodu HTML wygenerowanego przez serwer (własnego wyniku szablonu lub oczyszczonego tekstu sformatowanego z zaufanego edytora) innerHTML jest odpowiednie. Nigdy nie należy stosować go bezpośrednio do danych z niezaufanych źródeł bez ich oczyszczenia.

Oczyszczanie tekstu sformatowanego za pomocą DOMPurify

Jeśli użytkownicy przesyłają tekst sformatowany (na przykład w edytorze komentarzy lub podczas renderowania Markdown), przed ustawieniem innerHTML należy go oczyścić: el.innerHTML = DOMPurify.sanitize(richHtml). DOMPurify usuwa niebezpieczne znaczniki i atrybuty, zachowując bezpieczne formatowanie, takie jak <b>, <em> i <a>.

insertAdjacentHTML niesie takie samo ryzyko

el.insertAdjacentHTML("beforeend", html) analizuje ciągi HTML — stwarza takie samo zagrożenie XSS jak innerHTML. Obowiązują te same zasady: nigdy nie należy przekazywać bezpośrednio danych użytkownika; trzeba je oczyścić albo użyć metod DOM. To samo dotyczy document.write, choć obecnie nikt nie powinien już tego używać.

Domyślne zabezpieczenia frameworków

React, Vue, Svelte i Angular domyślnie wykonują escapowanie interpolowanego tekstu — {name} jest bezpieczne. Udostępniają mechanizmy omijające te zabezpieczenia (dangerouslySetInnerHTML w React i v-html w Vue), które niosą takie samo ryzyko XSS; należy używać ich oszczędnie i po oczyszczeniu danych.

Wstrzykiwanie do atrybutów

Nawet wartości atrybutów mogą być wektorem ataku: <a href={url}> z url="javascript:alert(1)" wykonuje kod po kliknięciu. Przed umieszczeniem danych użytkownika w href, src lub innych atrybutach zawierających adresy URL należy sprawdzać schematy adresów i zezwalać wyłącznie na http:, https:, mailto: oraz tel:.

Polityka Trusted Types

Współczesne przeglądarki obsługują Trusted Types: należy skonfigurować CSP za pomocą require-trusted-types-for 'script', aby innerHTML odrzucało surowe ciągi znaków — przepuszczane są wyłącznie wartości opakowane przez politykę. Dzięki temu XSS staje się niemożliwe na poziomie API, a nie dzięki samej dyscyplinie programistycznej.

Obrona warstwowa

Żadna pojedyncza warstwa nie wystarczy. Należy połączyć walidację danych wejściowych na serwerze, escapowanie danych wyjściowych podczas renderowania, CSP do blokowania wstrzykniętych skryptów, Trusted Types do odrzucania surowych ciągów znaków oraz przegląd bezpieczeństwa każdego użycia innerHTML. Obrona warstwowa pozwala przetrwać błąd w dowolnej pojedynczej warstwie.

Sprawdzenie wiedzy

Dlaczego el.textContent = userInput jest bezpieczne pod względem XSS, a el.innerHTML = userInput jest niebezpieczne?

Podsumowanie

Użycie innerHTML z danymi od użytkownika to klasyczny wektor XSS. Do tekstu używaj textContent, do struktury — createElement+textContent, a gdy wymagany jest sformatowany HTML — DOMPurify. Sprawdzaj schematy adresów URL w wartościach atrybutów. Dodaj CSP i Trusted Types, aby neutralizować błędy, które umknęły podczas przeglądu kodu. Nowoczesne frameworki domyślnie wykonują escapowanie — ich niebezpieczne mechanizmy omijające te zabezpieczenia powinny być używane rzadko i poddawane przeglądowi.

Często zadawane pytania

Czy lekcja „XSS przez innerHTML i zapobieganie atakom” jest bezpłatna?

Tak — pełny tekst „XSS przez innerHTML i zapobieganie atakom” 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 HTML Academy, przejdź na CoddyKit PRO. Kurs HTML Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „XSS przez innerHTML i zapobieganie atakom”?

Poznanie skryptów międzywitrynowych i bezpiecznych alternatyw dla innerHTML Ćwiczysz HTML 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ąć HTML Academy?

Nie wymagamy żadnego doświadczenia. HTML 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 2 z 4.

Ile czasu zajmuje lekcja „XSS przez innerHTML i zapobieganie atakom”?

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 HTML Academy?

Tak. Każda lekcja HTML 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

  1. Content Security Policy — meta http-equiv
  2. XSS przez innerHTML i zapobieganie atakom
  3. Sandbox iframe i Permissions Policy
  4. HTTPS i Subresource Integrity
← Powrót do HTML Academy