Что такое XSS

Ответ

XSS (Cross-Site Scripting) — уязвимость, позволяющая злоумышленнику внедрять вредоносный код (обычно JavaScript) на страницы, которые видят другие пользователи.

Типы XSS:

  1. Reflected — скрипт попадает в запрос (например, URL) и выполняется при отображении страницы.
  2. Stored — вредоносный код сохраняется на сервере (например, в комментариях) и выполняется при каждом открытии страницы.
  3. DOM-based — атака происходит полностью на стороне клиента через манипуляции с DOM.

Пример уязвимого кода:

// Опасный код, если `userInput` не экранирован
document.getElementById('output').innerHTML = userInput;

Защита:

  • Экранирование данных (textContent вместо innerHTML)
  • Использование Content Security Policy (CSP)
  • Валидация и санитизация ввода
  • HTTP-заголовки типа X-XSS-Protection

Ответ 18+ 🔞

Да ты посмотри, какая интересная хуйня! XSS, блядь, Cross-Site Scripting, а по-нашему — «межсайтовый скриптинг». Представь себе картину: сидит злоумышленник, такой хитрожопый пидарас, и втихаря лепит свой вредоносный код на странички, которые потом смотрят нормальные люди. И всё это на JavaScript, ёпта! Просто праздник какой-то.

Какие бывают, эти ваши XSS, блядь:

  1. Reflected (Отражённый) — это когда скрипт, сука, прилетает прямо в запросе, ну, в URL, например. Страница его подхватывает, отображает — и тут тебе пиздец, выполняется. Как будто зеркало подставили, а в него хуй с горы летит.
  2. Stored (Хранимый) — вот это уже поинтереснее. Этот гадский код, блядь, сохраняется прямо на сервере! В комментариях, в профиле, в посте. И каждый раз, когда кто-то эту страницу открывает — оп-па, сюрприз! Как долгоиграющая жопа, которая ждёт своего часа.
  3. DOM-based (На основе DOM) — а это, блядь, высший пилотаж. Вся атака происходит прямо у пользователя в браузере, через манипуляции с этой вашей DOM-структурой. Сервер тут вообще ни при чём, чистая клиентская подстава.

Вот, смотри, как это выглядит в коде, если накосячить:

// Опасно, блядь, опасно! Если `userInput` не обработать, будет пиздец.
document.getElementById('output').innerHTML = userInput;

Вот взял и вставил что прислали, а там, глядишь, уже скрипт висит, который куки ворует. Красота, да? Сам от себя охуеешь.

Как от этого спасаться, чтобы не обосраться:

  • Экранирование, ёпта! Вместо innerHTML юзай textContent. Не для того тебе мозги даны, чтобы всякую хуйню в HTML пихать.
  • Content Security Policy (CSP) — это, блядь, как шлагбаум с вооружённой охраной для твоего сайта. Говоришь браузеру, откуда можно скрипты грузить, а откуда — ни хуя.
  • Валидация и санитизация ввода. Проверяй, что тебе шлют, прежде чем принимать. Не всякий userInput — подарок судьбы, иногда это просто манда с ушами.
  • HTTP-заголовки, типа X-XSS-Protection. Старая, конечно, школа, но иногда и палка помогает.

Вот и вся наука. Не уследишь — будет тебе не сайт, а цирк с конями, где каждый проходящий может на стене хуй нарисовать.