Cross-Site Scripting, powszechnie znany jako XSS, jest jedną z najniebezpieczniejszych metod ataku stosowanych przez cyberprzestępców, dlatego ważne jest, aby każdy programista i badacz bezpieczeństwa wiedział, co to jest i jak to zrobić zapobiegać atakom. Jak więc możesz podjąć działania przeciwko luce w zabezpieczeniach XSS? Używasz HTML, JavaScript lub DOM, aby pokazać dane, które witryna otrzymuje od użytkownika. Jeden lub więcej z tych trzech różnych obszarów może ze sobą współpracować.
Jak zapobiegać XSS przy użyciu HTML
XSS umożliwia atakującym wstrzykiwanie złośliwych kodów lub skryptów na stronach internetowych, skierowanych do niczego niepodejrzewających użytkowników odwiedzających witrynę. Może to wykraść dane osobowe, przekierować odwiedzających do innej witryny utworzonej przez cyberprzestępcę lub w inny sposób zmienić wygląd strony internetowej. Ale możesz temu zapobiec; na przykład, powstrzymując ich przed wstawieniem kodu HTML.
Wyobraź sobie, że masz stronę internetową z księgą gości. Załóżmy, że Twoi goście korzystający z tej księgi gości mogą tu wpisywać swoje nazwiska i wiadomości, a ich wiadomości mogą być przeglądane publicznie. Atakujący, który chce wykonać test XSS w Twojej księdze gości, wykorzysta obszar, który przeznaczyłeś na napisanie wiadomości. Ten cyberprzestępca uruchomi tutaj kod JavaScript. Na przykład osoba atakująca może użyć kodu JavaScript, takiego jak:
<scenariusz>alarm("XSS-y!")</script>
Aby odnieść sukces, osoba atakująca musi użyć znacznika skryptu. Jeśli tego nie zrobią, kod JavaScript nie będzie działał. Musisz zakodować instrukcję
Jak zapobiegać XSS przy użyciu JavaScript
Logika w HTML też poprawne w JavaScript. W niektórych aplikacjach istnieje możliwość wydrukowania danych otrzymanych przez serwis od użytkownika za pomocą kodu JavaScript.
Rozważ to kodowanie:
<identyfikator p="wydrukować"></P>
<scenariusz>
document.getElementById("test").innerHTML = "";
</script>
Wyobraź sobie, że witryna korzysta z bloku kodu, takiego jak ten powyżej. Deweloper użył tutaj znacznika „p” o nazwie „print”. Jak widać z kodu, wartość będzie pochodzić z parametru „search”, a programista chce pokazać tę wartość przychodzącą w tagu „p”. Deweloper, który wykonał tę operację, chciał użyć funkcji innerHTML JavaScript.
Teraz spójrzmy na sytuację z punktu widzenia cyberatakującego. W takim przypadku atakujący wykona test XSS w obrębie tagu „script”. W tym celu atakujący nie musi ponownie uruchamiać tagu, ponieważ tag „script” jest już używany. Atakujący może następnie napisać taki test:
nazwa_pliku.php? szukaj=a" alarm("XSS-y!"); f= "
Ten kod pojawi się na stronie jako:
document.getElementById("test").innerHTML = " A" alarm("XSS-y!"); f="";
Ten atak by się udał. Aby lepiej zrozumieć problem, przeanalizujmy jeszcze jedną przykładową technikę, której może użyć atakujący. Haker mógł zastosować test XSS, taki jak:
nazwa_pliku.php? szukaj=";</script><oni>Fatih</em>
Tak by to wyglądało oglądane ze strony internetowej:
document.getElementById("test").innerHTML = "";</script><oni>Fatih</em>";
Może się to wydawać trochę dziwne, ponieważ atakujący zamknął pierwszy tag „script”, używając tutaj struktury takiej jak „/script”. Atakujący może więc zrestartować dowolny kod JavaScript i HTML.
Jeśli pomyślisz o tych dwóch różnych przykładach, ochrona przed XSS wydaje się całkiem prosta. Niezbędnym środkiem ostrożności byłoby zakodowanie pliku " I ' znaki, które widzisz w pierwszym przykładzie. W drugim przykładzie zakoduj znaki < I >.
Jak zapobiegać XSS przy użyciu DOM
W tym wariancie XSS dane, które strona otrzymuje od użytkownika, mogą ingerować we właściwości elementu DOM. Na przykład informacje o kolorze, które witryna otrzymuje od użytkownika, mogą wpływać na kolor tła tabeli lub całego tła strony. Tak więc użytkownik nieświadomie ingeruje w układy stylów korpusu i stołu. Poniższy kod jest tego dobrym przykładem:
<kolor bg ciała ="<?php echo $_GET['kolor']; ?>"/>
W tym celu witryna wykorzystuje parametr „kolor” otrzymany od użytkownika bezpośrednio we właściwości „bgcolor” elementu „body”. Co w takim razie mógł zrobić atakujący? Mogą wykonać ten złośliwy kod:
nazwa_pliku.php? kolor = czerwony" onload="alarm('XSS-y!')
Wygląda to tak, gdy ogląda się je ze strony internetowej:
<kolor bg ciała =" czerwony" onload="alarm('XSS-y!') "/>
Aby temu zapobiec, programista musiałby zakodować plik " postać.
Należy jednak zwrócić uwagę na jeszcze jeden ważny element JavaScript. Poniższy fragment kodu jest tego przykładem:
<href="javascript: alert('XSS-y!')">
Oznacza to, że możliwe jest bezpośrednie uruchomienie kodu JavaScript. Jednym z najlepszych środków zapobiegawczych jest upewnienie się, że witryna sprawdza, czy dane, które otrzymuje od użytkowników, to prawdziwy adres URL. Najprostszą metodą jest upewnienie się, że istnieją wyrażenia takie jak „HTTP” i „HTTPS” (bezpieczna wersja protokołu HTTP) w związku.
Przykładowa funkcja zapobiegająca XSS za pomocą PHP
Widziałeś kilka przykładów, jak chronić aplikację lub stronę internetową przed atakami XSS. Możesz użyć fragmentów kodu w tej tabeli z PHP:
Koduj w HTML |
htmlspecialchars($str, ENT_COMPAT) |
Zakoduj w JavaScript i atrybucie DOM |
htmlspecialchars($str, ENT_NOQUOTES) |
Sprawdzanie adresów URL |
'/^(((https?)|(\/\/))).*/'; |
Pamiętaj, że są to tylko przykłady i będą się różnić w zależności od używanego języka oprogramowania.
Możesz stworzyć aplikację internetową w PHP i wypróbuj kody widoczne powyżej, aby je wysłać. Jeśli zastanawiasz się, jak używać wszystkich tych metod, możesz zaczerpnąć kilka pomysłów z poniższego bloku kodu PHP, co powinno być przydatne, nawet jeśli używasz innego języka:
<php
$dane = $_GET['dane'];funkcjonowaćw_atrybucie($str){
powrót htmlspecialchars($str, ENT_COMPAT);
// ENT_COMPAT zakoduje znak podwójnego cudzysłowu (").
}
funkcjonowaćw_html($str){
$łącze = '/^(((https?)|(\/\/))).*/';
Jeśli(!preg_match($link, $str))
{
powrót "/";
}
powrót $str;
}
$dane = in_attribute($dane);
$dane = in_html($dane);
$dane = rzeczywisty_url (dane);
?>
Chroń swoją witrynę przed XSS i nie tylko
XSS to popularny wektor ataku wykorzystywany przez hakerów. Zwykle wartość ścieżki w adresie URL, dowolne pole w Twojej witrynie, w którym można wprowadzać dane (takie jak pola formularzy i komentarzy), może służyć do testowania luki w zabezpieczeniach XSS. Ale oczywiście istnieje wiele różnych metod, których cyberprzestępcy mogą użyć do zaatakowania witryny, zwłaszcza jeśli masz witrynę, która ma wielu użytkowników i ukrywa ich informacje.