Jak zapobiegać skryptom między witrynami za pomocą HTML, JavaScript i DOM
Cross-Site Scripting, powszechnie znany jako XSS, jest jedną z najniebezpieczniejszych metod ataków stosowanych przez cyberprzestępców, dlatego bardzo ważne jest, aby każdy programista i badacz bezpieczeństwa wiedział, co to jest i jak 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 umieszczanie złośliwych kodów lub skryptów na stronach internetowych, celując w 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 wstawianiem 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:
<script>alert("The XSS!")</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ę <, aby użytkownicy nigdy nie mogli używać tagów HTML. Utrudni to atakującemu pracę z tagami HTML.
Jak zapobiegać XSS przy użyciu JavaScript
Logika w HTML jest również poprawna w JavaScript. W niektórych aplikacjach istnieje możliwość wydrukowania danych otrzymanych przez serwis od użytkownika za pomocą kodu JavaScript.
Rozważ to kodowanie:
<p id="print"></p>
<script>
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:
filename.php?search=a" alert("The XSS!"); f= "
Ten kod pojawi się na stronie jako:
document.getElementById("test").innerHTML = " a" alert("The XSS!"); 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:
filename.php?search=";</script><em>Fatih</em>
Tak by to wyglądało oglądane ze strony internetowej:
document.getElementById("test").innerHTML = " ";</script><em>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 znaków „ i ’ , 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:
<body bgcolor="<?php echo $_GET['color'];? >"/>
W tym celu witryna korzysta z parametru „kolor” otrzymanego 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:
filename.php?color=red" onload="alert('The XSS!')
Wygląda to tak, gdy ogląda się je ze strony internetowej:
<body bgcolor=" red" onload="alert('The XSS!') "/>
Aby temu zapobiec, programista musiałby zakodować znak „ .
Należy jednak zwrócić uwagę na jeszcze jeden ważny element JavaScript. Poniższy fragment kodu jest tego przykładem:
<a href="javascript:alert('The XSS!')">
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 w połączeniu występują wyrażenia takie jak „HTTP” i „HTTPS” (bezpieczna wersja protokołu HTTP).
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:
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ą za pomocą PHP i wypróbować kody, które widzisz powyżej, aby je napisać. Jeśli zastanawiasz się, jak korzystać z tych wszystkich metod, możesz zaczerpnąć kilka pomysłów z poniższego bloku kodu PHP, który powinien być przydatny, nawet jeśli używasz innego języka:
<?php
$data = $_GET['data'];
function in_attribute($str){
return htmlspecialchars($str, ENT_COMPAT);
// ENT_COMPAT will encode the double quote (") character.
}
function in_html($str){
$link = '/^(((https?)|(\/\/))).*/';
if(!preg_match($link, $str))
{
return "/";
}
return $str;
}
$data = in_attribute($data);
$data = in_html($data);
$data = real_url(data);
?>
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.
Dodaj komentarz