Что такое уязвимость Cross-Site Scripting (XSS)

Ответ

Cross-Site Scripting (XSS) — это тип уязвимости веб-приложений, который позволяет злоумышленнику внедрять вредоносный клиентский код (обычно JavaScript) на веб-страницы, просматриваемые другими пользователями. Цель — выполнить код в браузере жертвы для кражи данных (cookie, токены сессий), изменения содержимого страницы или перенаправления на фишинговые сайты. **Основные типы XSS:** 1. **Отражённый (Reflected XSS):** Вредоносный скрипт передаётся через URL или форму, и сервер сразу же "отражает" его в ответе пользователю. Скрипт не сохраняется на сервере. 2. **Хранимый (Stored/Persistent XSS):** Атакующий сохраняет вредоносный скрипт в базе данных на сервере (например, в комментарии, профиле пользователя). Скрипт выполняется каждый раз, когда кто-то просматривает заражённую страницу. 3. **На основе DOM (DOM-based XSS):** Уязвимость находится в клиентском коде, который манипулирует DOM-деревом страницы на основе пользовательского ввода без участия сервера. **Пример уязвимого кода (Python/Flask):** ```python from flask import Flask, request app = Flask(__name__) # Уязвимый эндпоинт @app.route('/search') def search(): query = request.args.get('q', '') # Прямой вывод пользовательского ввода без экранирования return f"

Результаты по запросу: {query}

" # URL для атаки: # http://example.com/search?q= ``` **Основные методы защиты:** * **Экранирование вывода (Output Escaping):** Всегда обрабатывайте данные, выводимые в HTML, преобразуя спецсимволы (`<`, `>`, `&`, `"`) в их безопасные эквиваленты (`<`, `>`, `&`, `"`). Большинство шаблонизаторов (Jinja2, Django Templates) делают это по умолчанию. * **Валидация ввода (Input Validation):** Проверяйте и очищайте все входящие данные на соответствие ожидаемому формату. * **Content Security Policy (CSP):** Используйте HTTP-заголовок `Content-Security-Policy` для указания браузеру, из каких источников разрешено загружать и выполнять скрипты.

Ответ 18+ 🔞

Ну вот, сидишь ты такой, пишешь свой сайт, думаешь — красота, всё работает. А потом бац — какой-то умник присылает тебе ссылочку, ты по ней кликаешь, и у тебя на странице выскакивает окошко «Хуй с горы!». Или, что хуже, твои куки уплывают к лешему. Это, дружище, и есть XSS, или, по-нашему, межсайтовый скриптёж. Короче, дыра, через которую можно впихнуть в твою страничку свой скрипт, и он выполнится в браузере у любого лоха, который её откроет. **Какие они бывают, эти гады:** 1. **Отражённый (Reflected XSS):** Самый простой, как пощёчина. Злодей подсовывает тебе ссылку со скриптом в параметре, типа `?q=`. Твой сервер, не моргнув глазом, эту хуйню в ответ суёт, и скрипт срабатывает прямо у тебя в браузере. Не сохраняется нигде, одноразовый. 2. **Хранимый (Stored/Persistent XSS):** А вот это уже по-серьёзному, блядь. Атакующий запихивает свой скрипт прямиком в твою базу данных — в комментарий, в описание профиля, в пост. И теперь этот скрипт, как ядрёна вошь, живёт на сервере и выполняется у **каждого**, кто эту страницу открывает. Пидары налетели — и всем пизда. 3. **На основе DOM (DOM-based XSS):** Самый хитрый, жопа с ручками. Тут сервер вообще ни при чём, вся трагедия разыгрывается прямо в браузере. Твой же фронтенд-код, на JavaScript, берёт что-то из URL (например, хеш `#`) и, не подумав, вставляет в страницу. А там, естественно, скрипт. И опять — в рот меня чих-пых. **Смотри, как это просто сломать (Python/Flask):** ```python from flask import Flask, request app = Flask(__name__) # Уязвимый эндпоинт @app.route('/search') def search(): query = request.args.get('q', '') # Прямой вывод пользовательского ввода без экранирования return f"

Результаты по запросу: {query}

" # URL для атаки: # http://example.com/search?q= ``` Видишь? Берём что прислали, и тупо в HTML суём. Ёпта, это же приглашение: «Заходи, не стесняйся, исполняй тут что хочешь!». **Как не облажаться и защититься:** * **Экранирование вывода (Output Escaping):** Это святое, блядь. ВСЕГДА, когда выводишь что-то пользовательское в HTML, превращай опасные символы в безобидные буковки. `<` в `<`, `>` в `>`. Хорошие шаблонизаторы (Jinja2, Django) это делают сами, но ты не выключай эту фичу, ебать тебя в сраку! * **Валидация ввода (Input Validation):** Не доверяй никому, особенно пользователям. Принимай данные только в том формате, в котором ждёшь. Хочешь номер телефона — принимай только цифры. Всё остальное — нахуй. * **Content Security Policy (CSP):** Это, типа, верховный главнокомандующий для твоего браузера. Через HTTP-заголовок ты говоришь ему: «Слушай сюда, скрипты грузи ТОЛЬКО отсюда и отсюда, а с остальных мест — ни хуя». Даже если скрипт как-то просочится, браузер его не выполнит. Красота, да и только. В общем, суть в чём: никогда не верь тому, что пришло от пользователя, и всегда причёсывай данные, прежде чем их куда-то воткнуть. А то будет тебе не сайт, а полигон для скриптокидсов.