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
Co dziś robimy
- 12 minNa czym polega XSS Skutki bywają poważne: kradzież ciasteczek sesji, podmiana treści strony, przekierowanie…
- 12 minhtmlspecialchars i kontekst wypisania Używamy flag ENT_QUOTES i kodowania UTF-8 .
- 12 minZasady bezpiecznego wypisywania Dobra praktyka to jedna funkcja pomocnicza, np.
- 4 minĆwiczenia 16 zadań w module — wybierz 3–4 na lekcję
- 5 minPodsumowanie bilet wyjściowy i zadanie domowe
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.
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>';
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>';
Pytanie do klasy
Co oznacza skrót XSS?
Poprawna: a) XSS to wstrzyknięcie kodu JavaScript do strony.
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() .
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>';
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>';
Pytanie do klasy
Co robi htmlspecialchars()?
Poprawna: c) Znaki specjalne stają się bezpiecznymi encjami.
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.
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>';
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>';
Pytanie do klasy
Czy dane z bazy są bezpieczne?
Poprawna: d) Dane w bazie mogły zostać zapisane przez użytkownika.
Ćwiczenia w module (16)
- 1Pierwszy htmlspecialchars
- 2Znaki mniejszości i encje
- 3Zabezpieczenie formularza POST
- 4Fraza z adresu GET
- 5Dane z bazy Stored XSS
- 6Wielopolowe zabezpieczenie
- 7Atrybut value i ENT_QUOTES
- 8Zdarzenie w atrybucie
- 9htmlspecialchars zamiast strip_tags
- 10Kolejność nl2br i encji
- 11Weryfikacja linku w href
- 12Pętla po danych z bazy
- 13Własna funkcja pomocnicza
- 14Wypełnienie formularza po błędzie
- 15Zabezpieczenie ciasteczka COOKIE
- 16Karta ogłoszenia synteza XSS
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
Odpowiedź: d) Przy wypisywaniu