Obrona przed atakami XSS

XSS (cross-site scripting) – sposób ataku na serwis WWW polegający na osadzeniu w treści atakowanej strony kodu (zazwyczaj JavaScript). Haker tworzy specjalny adres URL, za pomocą którego może wykonywać złośliwy skrypt.

Najczesniej błędy typu xss wykorzystuje się do wykradania danych użytkownika (kradzieży kont) i tym samym zwiększania uprawnien na serwerze (można np. bez znajomosci hasła admina działac z jego uprawnieniami na stronie). Poprzez sam błąd xss można też podejrzeć jakiś plik na atakowanym serwerze (jeśli np. błąd xss tyczy się ładowania plików na stronie www).

Na przykład, witryna jest zasilana przez PHP, i strona jest informacją o kontach użytkowników. URL najczęściej w takich przypadkach wygłada następująco:

przykladowastrona.pl/profile.php?user=Sylwia

W tym adresie URL nie jest zły, ale najbardziej narażony punkt może się ukrywać w kodzie PHP stron, na przykład:

<?php
echo "Informacje o profilu". $_GET['user'];
?>

Jak widać, dane GET nie są one filtrowane i wyprowadzają sie bezpośrednio na stronie. Więc możemy zmodyfikować adres URL do tego:

przykladowastrona.pl/profile.php?user=Sylwia - witam

Przy wykonaniu tego kodu na stronie pojawi się komunikat („witam”) obok nazwy użytkownika. To nie jest najgorsze, teraz spróbujmy to:

przykladowastrona.pl/profile.php?user=Sylwia<script>alert (0); </script>

I już to jest groźne, teraz haker używa dziurę i w stanie zrobić co chce.

Jak się chronić przed atakami XSS? Odpowiedź jest prosta, trzeba elementarną filtrowania danych – wszystkie dane otrzymane przez POST lub GET.

Oto przykład funkcji w PHP, które mogą pomóc:

<?php
// Obrona przed XSS
function _filtracja( $var , $sql = 0) {
$var = strip_tags($var);
$var=str_replace ("\n"," ", $var);
$var=str_replace ("\r","", $var);
$var = htmlentities($var);
if ( $sql == 1) {
$var = mysql_real_escape_s
}
return $var;
}
?>

Wykorzystywanie:
<?php echo _filtracja($_GET['value']); ?>

Wtórny parametr $sql przeznaczony do ochrony SQL-iniekcji. musi być ustawiony na 1 podczas filtrowania danych do zapytania SQL, na przykład:

SELECT... LIMIT 0, _filtracja($_GET ['limit'],1)

Jest to, jak łatwo można załatać dziurę XSS na stronie.

P.S.: Odrębne podziękowania dla Michała za pomysł i dodatkową informacje 🙂

Polski
English
Русский