Что такое отражённые XSS
Суть отражённой XSS заключается в том, что бэкэнд не фильтрует (или плохо фильтрует) полученные от пользователя данные и выводит их в браузер. Таким образом злоумышленнику как правило достаточно просто сформировать ссылку и заманить на нее пользователя.
Пример уязвимости
Предположим у нас есть код который выводит имя пользователя полученное из GET параметра
echo '<h1>Привет, '.$_GET['username'].'</h1>';
Если мы переходим по ссылке some.site/hello?name=Вася
то страница будет содержать следующий контент:
<h1>Привет, Вася</h1>
Но если мы запросим страницу some.site/hello?name=Вася</h1><script>alert('xss')</script><h1>
и страница будет содержать следующий html код
<h1>Привет, Вася</h1><script>alert('xss')</script><h1></h1>
Таким образом в браузере пользователя выполнится JavaScript код злоумышленника.
Защита
Необходимо всегда фильтровать данные полученные из вне. В php есть замечательная функция htmlspecialchars которая поможет спастись от xss атак.
htmlspecialchars — Преобразует специальные символы в HTML-сущности Производятся следующие преобразования: '&' (амперсанд) преобразуется в '&' '"' (двойная кавычка) преобразуется в '"' в режиме ENT_NOQUOTES is not set. "'" (одиночная кавычка) преобразуется в ''' (или ') только в режиме ENT_QUOTES. '<' (знак "меньше чем") преобразуется в '<' '>' (знак "больше чем") преобразуется в '>'
Чтобы избавиться от уязвимости в коде выше, необходимо переписать его следующим образом
$username = htmlspecialchars($_GET['username']);
echo '<h1>Привет, '.$username.'</h1>';
Теперь, при переходе по ранее уязвимой ссылке some.site/hello?name=Вася</h1><script>alert('xss')</script><h1>
будет выведен следующий html
<h1>Привет, Вася</h1><script>alert('xss')</script><h1></h1>
Пользователь при этом увидит
Привет, Вася
</h1><script>alert('xss')</script><h1>