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.
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.
$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>';
$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>';
Co oznacza skrót XSS?
Poprawna: a) XSS to wstrzyknięcie kodu JavaScript do strony.
htmlspecialchars() zamienia znaki < , > , cudzysłowy i ampersand na encje. Przeglądarka pokazuje wtedy tekst, a nie wykonuje znaczników.
$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>';
$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>';
Co robi htmlspecialchars()?
Poprawna: c) Znaki specjalne stają się bezpiecznymi encjami.
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.
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>';
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>';
Czy dane z bazy są bezpieczne?
Poprawna: d) Dane w bazie mogły zostać zapisane przez użytkownika.