W budowie
Prezentacja modułu

Część 16 · Bezpieczeństwo: ochrona przed XSS — kurs PHP INF.03

Część 16 kursu PHP pod kątem INF.03: Bezpieczeństwo aplikacji webowych, zapobieganie atakom Cross-Site Scripting (XSS), funkcja htmlspecialchars(), flaga ENT_QUOTES i konteksty HTML.

  • 45 min
  • 16 slajdów
  • Notatki nauczyciela: N
  • Strona modułu: otwórz
Plan · 45 min

Co dziś robimy

  1. 12 minNa czym polega XSS Skutki bywają poważne: kradzież ciasteczek sesji, podmiana treści strony, przekierowanie…
  2. 12 minhtmlspecialchars i kontekst wypisania Używamy flag ENT_QUOTES i kodowania UTF-8 .
  3. 12 minZasady bezpiecznego wypisywania Dobra praktyka to jedna funkcja pomocnicza, np.
  4. 4 minĆwiczenia 16 zadań w module — wybierz 3–4 na lekcję
  5. 5 minPodsumowanie bilet wyjściowy i zadanie domowe
Atom 1 z 4 · ~12 min

Na czym polega XSS

XSS (Cross-Site Scripting) to wstrzyknięcie kodu JavaScript do strony przez dane od użytkownika. Jeśli komentarz zawiera znacznik script i zostanie wypisany bez zabezpieczenia, przeglądarka wykona ten kod.

  • Skutki bywają poważne: kradzież ciasteczek sesji, podmiana treści strony, przekierowanie na obcy adres.
  • Wystarczy jedno niezabezpieczone miejsce, żeby cała aplikacja była zagrożona.
  • Źródłem danych może być formularz, parametr adresu, a nawet zawartość bazy wpisana wcześniej przez innego użytkownika.
  • Dlatego zabezpieczamy dane przy wypisywaniu, a nie tylko przy zapisie.
Kod · atom 1 · ~3 min

Jak to wygląda w kodzie

$komentarz = $_GET['komentarz'] ?? '';

// zle: przegladarka wykona ewentualny skrypt
echo '<div>' . $komentarz . '</div>';

// dobrze: dane staja sie tekstem
echo '<div>' . htmlspecialchars($komentarz, ENT_QUOTES, 'UTF-8') . '</div>';
Przykład na żywo · atom 1 · ~3 min

Uruchom i pokaż

$komentarz = $_GET['komentarz'] ?? '';

// zle: przegladarka wykona ewentualny skrypt
echo '<div>' . $komentarz . '</div>';

// dobrze: dane staja sie tekstem
echo '<div>' . htmlspecialchars($komentarz, ENT_QUOTES, 'UTF-8') . '</div>';
Sprawdzenie · atom 1 · ~2 min

Pytanie do klasy

Co oznacza skrót XSS?

Atom 2 z 4 · ~12 min

htmlspecialchars i kontekst wypisania

htmlspecialchars() zamienia znaki < , > , cudzysłowy i ampersand na encje. Przeglądarka pokazuje wtedy tekst, a nie wykonuje znaczników.

  • Używamy flag ENT_QUOTES i kodowania UTF-8 .
  • Wartość musi być zabezpieczona także w atrybutach HTML, np.
  • W kontekście JavaScriptu lub adresu URL potrzebne są inne funkcje, np.
  • json_encode() czy urlencode() .
Kod · atom 2 · ~3 min

Jak to wygląda w kodzie

$imie = $_GET['imie'] ?? '';

echo '<p>Witaj, ' . htmlspecialchars($imie, ENT_QUOTES, 'UTF-8') . '</p>';
echo '<input type="text" value="' . htmlspecialchars($imie, ENT_QUOTES, 'UTF-8') . '">';
echo '<a href="szukaj.php?q=' . urlencode($imie) . '">Szukaj</a>';
Przykład na żywo · atom 2 · ~3 min

Uruchom i pokaż

$imie = $_GET['imie'] ?? '';

echo '<p>Witaj, ' . htmlspecialchars($imie, ENT_QUOTES, 'UTF-8') . '</p>';
echo '<input type="text" value="' . htmlspecialchars($imie, ENT_QUOTES, 'UTF-8') . '">';
echo '<a href="szukaj.php?q=' . urlencode($imie) . '">Szukaj</a>';
Sprawdzenie · atom 2 · ~2 min

Pytanie do klasy

Co robi htmlspecialchars()?

Atom 3 z 4 · ~12 min

Zasady bezpiecznego wypisywania

Najprostsza zasada: każdą wartość spoza skryptu wypisujemy przez funkcję zabezpieczającą. Dotyczy to również danych z bazy, bo mogły zostać zapisane wcześniej przez innego użytkownika.

  • Dobra praktyka to jedna funkcja pomocnicza, np.
  • e($tekst) , używana w całym projekcie.
  • Nie warto polegać na „oczyszczaniu” danych przy zapisie i wypisywaniu surowych wartości.
  • To, co jest bezpieczne w bazie, może być niebezpieczne w innym kontekście HTML.
Kod · atom 3 · ~3 min

Jak to wygląda w kodzie

function e($tekst) {
    return htmlspecialchars((string) $tekst, ENT_QUOTES, 'UTF-8');
}

$komentarz = $_GET['komentarz'] ?? '';
echo '<p>' . e($komentarz) . '</p>';
echo '<p>' . e('Wiadomosc zapisana') . '</p>';
Przykład na żywo · atom 3 · ~3 min

Uruchom i pokaż

function e($tekst) {
    return htmlspecialchars((string) $tekst, ENT_QUOTES, 'UTF-8');
}

$komentarz = $_GET['komentarz'] ?? '';
echo '<p>' . e($komentarz) . '</p>';
echo '<p>' . e('Wiadomosc zapisana') . '</p>';
Sprawdzenie · atom 3 · ~2 min

Pytanie do klasy

Czy dane z bazy są bezpieczne?

Zamknięcie · ~3 min

Co zabrać z lekcji

  • Skutki bywają poważne: kradzież ciasteczek sesji, podmiana treści strony, przekierowanie na obcy adres.
  • W kontekście JavaScriptu lub adresu URL potrzebne są inne funkcje, np.
  • Najprostsza zasada: każdą wartość spoza skryptu wypisujemy przez funkcję zabezpieczającą.
  • Ćwiczenia
Bilet wyjściowy: Gdzie zabezpieczamy dane?
Odpowiedź: d) Przy wypisywaniu
Hyżyk· Część 16 · Bezpieczeństwo: ochrona przed XSS — kurs PHP INF. moduł 1 / 1