Przejdź do głównej treści
Grafika przedstawia ukryty obrazek

Ataki XSS (Cross-Site Scripting)

Ataki XSS

Cross-Site Scripting (XSS) to jedna z najczęstszych luk bezpieczeństwa w aplikacjach webowych. Polega na wstrzyknięciu złośliwego kodu JavaScript do stron internetowych, który może być wykonany w przeglądarkach użytkowników. Ataki XSS mogą prowadzić do kradzieży danych, przechwycenia sesji użytkowników, a nawet przejęcia kontroli nad kontami.

Rodzaje ataków XSS

1. Stored XSS (trwały XSS)

W tym ataku złośliwy kod JavaScript jest przechowywany na serwerze i wyświetlany wszystkim użytkownikom, którzy odwiedzą stronę. Jest szczególnie niebezpieczny, ponieważ może dotknąć wielu użytkowników jednocześnie.

Przykład:

Użytkownik wprowadza w formularzu komentarza następujący kod:

<script>alert('Atak XSS!');</script>

Jeśli aplikacja nie filtruje danych wejściowych, komentarz zostanie zapisany w bazie danych i wyświetlony innym użytkownikom, uruchamiając alert w ich przeglądarkach.

2. Reflected XSS (odbijany XSS)

W tym przypadku złośliwy skrypt jest przekazywany w parametrze URL lub formularzu i odzwierciedlany na stronie bez odpowiedniego filtrowania. Jest często wykorzystywany w atakach phishingowych.

Przykład:

Użytkownik klika w link:

http://example.com/search?q=<script>alert('XSS!')</script>

Jeśli aplikacja odzwierciedla wartość parametru q bez odpowiedniego oczyszczania, kod JavaScript zostanie wykonany w przeglądarce ofiary.

3. DOM-Based XSS

Atak ten występuje, gdy skrypt po stronie klienta manipuluje DOM-em w taki sposób, że powoduje wykonanie złośliwego kodu.

Przykład:

Kod JavaScript na stronie:

document.write("Witaj, " + window.location.hash);

Jeśli użytkownik wejdzie na stronę:

http://example.com/#<script>alert('XSS!')</script>

w przeglądarce zostanie wykonany złośliwy kod JavaScript.

XSS w kontekście Markdown

Markdown to popularny język znaczników używany do formatowania tekstu, np. w dokumentacji czy komentarzach. Niektóre implementacje Markdown pozwalają na wstawianie surowego HTML-a, co może prowadzić do ataków XSS.

Przykład:

Jeśli aplikacja pozwala użytkownikom na dodawanie treści w Markdown i nie filtruje odpowiednio HTML-a, atakujący może wprowadzić następujący kod:

<script>alert('Atak XSS w Markdown!');</script>

W zależności od implementacji, przeglądarka może wykonać ten kod i zagrozić bezpieczeństwu użytkowników.

Inny przykład dotyczy atrybutu onerror w obrazach:

![złośliwy obraz](x "onerror=alert('XSS w Markdown!')")

Jeżeli aplikacja nie blokuje atrybutów JavaScript w tagach <img>, kod może się wykonać.

Jak zabezpieczyć aplikację przed XSS w Markdown?

  1. Użycie bezpiecznych parserów Markdown, np. marked w trybie „sanitize” lub commonmark.
  2. Filtracja niebezpiecznych tagów HTML – usuwanie <script>, <iframe>, onerror, onload itp.
  3. Escapowanie wyjścia – konwertowanie znaków <> na &lt; i &gt;.
  4. Ograniczenie obsługi HTML w Markdown – np. poprzez wymuszenie czystego Markdown bez osadzonego HTML-a.

Jak zabezpieczyć aplikację przed XSS?

  1. Filtrowanie i walidacja danych wejściowych – należy unikać bezpośredniego wstawiania danych użytkownika do HTML.
  2. Użycie funkcji do kodowania danych – np. htmlspecialchars() w PHP czy escape() w JavaScript.
  3. CSP (Content Security Policy) – ograniczenie możliwości wykonywania nieautoryzowanego kodu JavaScript.
  4. HttpOnly dla ciasteczek – zapobiega kradzieży sesji przez JavaScript.
  5. Unikanie innerHTML i document.write – zamiast tego należy używać textContent.

Wykrywanie XSS

Oto funkcja Valid::not_xss w PHP, która wykrywa potencjalne ataki XSS, w tym w dokumentach Markdown:

class Valid {
    public static function not_xss(string $input): bool {
        // Przypadki ataków XSS w HTML i JavaScript
        $patterns = [
            '/<script.*?>.*?<\/script>/is', // Wykrywanie znaczników <script>
            '/javascript:/i', // Wykrywanie wywołań "javascript:"
            '/on[a-z]+\s*=\s*["\']?[^"\'>]+["\']?/i', // Wykrywanie zdarzeń JS np. onerror="..."
            '/<.*?href\s*=\s*["\']?javascript:[^>]+>/i', // Wykrywanie href="javascript:"
            '/<.*?style\s*=\s*["\']?expression\(.*?\)/i', // Wykrywanie expression() w CSS
            '/vbscript:/i', // Wykrywanie VBScript (stare ataki IE)
            '/data\s*:.*?base64,.*?(<script|on[a-z]+\s*=)/i', // Wykrywanie ataków base64
        ];

        // Przypadki ataków XSS w Markdown
        $markdown_patterns = [
            '/\[.*?\]\(\s*javascript:.*?\)/i', // [tekst](javascript:alert(1))
            '/!\[.*?\]\(\s*data:image\/.*?;base64,.*?\)/i', // ![alt](data:image/…)
        ];

        foreach (array_merge($patterns, $markdown_patterns) as $pattern) {
            if (preg_match($pattern, $input)) {
                return false; // Znaleziono podejrzaną treść
            }
        }

        return true; // Brak wykrytych ataków XSS
    }
}

Podsumowanie

Ataki XSS są poważnym zagrożeniem dla aplikacji webowych, jednak można się przed nimi skutecznie bronić poprzez odpowiednie praktyki programistyczne. Regularne testowanie zabezpieczeń i stosowanie polityk bezpieczeństwa to klucz do ochrony użytkowników przed skutkami tych ataków.

6 marca 2025 14

Kategorie

programowanie

Dziękujemy!
()

Powiązane wpisy

Obraz ilustrujacy Mechanizm Antiflood  jak dziaa i jak go zaimplementowa w PHP
22 stycznia 2025 3 min 7

Mechanizm Antiflood – jak działa i jak go zaimplementować w PHP

Czytaj więcej
Wizualizacja tematu Basic Authentication i Digest Authentication  porwnanie oraz analiza bezpieczest
22 stycznia 2025 3 min 20

Basic Authentication i Digest Authentication – porównanie oraz analiza bezpieczeństwa

Czytaj więcej
Grafika przedstawia Bearer Authorization  mechanizm bezpieczestwo zagroenia i implementacja
22 stycznia 2025 3 min 12

Bearer Authorization – mechanizm, bezpieczeństwo, zagrożenia i implementacja

Czytaj więcej
Wymiana doświadczeń

Masz podobne doświadczenia?

Chętnie poznam Twoją perspektywę i porozmawiam o tym temacie szerzej.

Napisz do mnie

Każda perspektywa może wnieść coś wartościowego do dyskusji.

Twoja prywatność i pliki cookies

  1. Ta strona internetowa wykorzystuje wyłącznie niezbędne pliki cookies, które są wymagane do jej prawidłowego działania – m.in. do poprawnego wyświetlania treści, zapamiętania podstawowych ustawień przeglądarki oraz zapewnienia stabilności serwisu.
  2. Nie stosuję plików cookies w celach marketingowych, reklamowych ani analitycznych.
  3. Strona ma charakter wyłącznie informacyjny i nie zawiera formularzy kontaktowych, rejestracyjnych ani zakupowych, przez które dane mogłyby być przesyłane na serwer.
  4. Nie zbieram danych osobowych podczas zwykłego korzystania z witryny.
  5. Serwis nie korzysta z certyfikatu SSL, jednak ze względu na informacyjny charakter strony nie jest wymagane przesyłanie poufnych danych. Zalecam jednak, aby nigdy nie wpisywać haseł ani danych osobowych na stronach bez szyfrowanego połączenia.
  6. Korzystając z tej strony, wyrażasz zgodę na używanie wyłącznie niezbędnych plików cookies.

Więcej informacji znajdziesz w mojej polityce prywatności.