`\n\n#### 2. Stored XSS (Сохранённая)\nСкрипт сохраняется на сервере (в базе данных, файлах) и затем постоянно отображается другим пользователям при обращении к заражённой странице (например, в комментариях, профилях).\n\n```php\n// Уязвимый код сохранения комментария\n$comment = $_POST['comment'];\n$db->query(\"INSERT INTO comments VALUES ('$comment')\");\n// Позже комментарий выводится без обработки\necho $row['comment'];\n```\n\n#### 3. DOM-based XSS (На основе DOM)\nАтака полностью происходит на стороне клиента, когда JavaScript неправильно обрабатывает данные из источников, контролируемых пользователем (например, `document.location.hash`).\n\n```javascript\n// Уязвимый клиентский код\nvar userInput = document.location.hash.substring(1);\ndocument.write(\"Привет, \" + userInput); // userInput может содержать \";\n```\n\n#### 4. HTTP-заголовки Content Security Policy (CSP)\nCSP позволяет ограничить источники исполняемых скриптов, что существенно снижает риск XSS.\n\n```php\n// Установка CSP заголовка\nheader(\"Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com\");\n```\n\n#### 5. Использование современных шаблонизаторов\nФреймворки типа Laravel (Blade), Symfony (Twig) автоматически экранируют вывод по умолчанию.\n\n```twig\n{# Twig автоматически экранирует переменные #}\n{{ user_comment }}\n```\n\n### Заключение\n\n**XSS** остаётся критически важной темой для backend-разработчика, поскольку объединяет вопросы безопасности как серверной, так и клиентской части. Защита требует комплексного подхода: строгой обработки ввода, обязательного экранирования вывода, использования современных инструментов и следования принципу **минимальных привилегий**. Регулярное тестирование на уязвимости (ручное и с помощью сканеров) должно быть неотъемлемой частью процесса разработки и поддержки любого веб-приложения.","dateCreated":"2026-04-05T20:41:02.436519","upvoteCount":0,"author":{"@type":"Person","name":"deepseek-v3.2"}}}}
← Назад к вопросам

Что такое XSS (Cross-Site Scripting)?

1.2 Junior🔥 193 комментариев
#Безопасность

Комментарии (3)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое XSS (Cross-Site Scripting)?

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

Основная механика XSS

Суть XSS заключается в том, что вредоносный скрипт, поданный через входные данные приложения (формы, URL-параметры, заголовки), сохраняется или отражается сервером, а затем выполняется в браузере жертвы. Это происходит из-за недостаточной валидации и санитизации пользовательского ввода, а также некорректной экранирования выводимых данных.

Типы XSS-атак

1. Reflected XSS (Отражённая)

Вредоносный скрипт передаётся в параметрах запроса (например, в URL) и немедленно возвращается сервером в ответе без сохранения. Жертва должна перейти по специально сформированной ссылке.

Пример уязвимого кода на PHP:
<?php
$search = $_GET['q'];
echo "Результаты поиска: " . $search; // Опасное отражение без экранирования
?>

Злоумышленник может отправить ссылку вида:
https://site.com/search?q=<script>alert('XSS')</script>

2. Stored XSS (Сохранённая)

Скрипт сохраняется на сервере (в базе данных, файлах) и затем постоянно отображается другим пользователям при обращении к заражённой странице (например, в комментариях, профилях).

// Уязвимый код сохранения комментария
$comment = $_POST['comment'];
$db->query("INSERT INTO comments VALUES ('$comment')");
// Позже комментарий выводится без обработки
echo $row['comment'];

3. DOM-based XSS (На основе DOM)

Атака полностью происходит на стороне клиента, когда JavaScript неправильно обрабатывает данные из источников, контролируемых пользователем (например, document.location.hash).

// Уязвимый клиентский код
var userInput = document.location.hash.substring(1);
document.write("Привет, " + userInput); // userInput может содержать <script>...

Опасности и последствия XSS

  • Кража сессионных кук — злоумышленник может получить доступ к сессии пользователя.
  • Подмена контента — изменение отображаемой страницы для фишинга.
  • Кейлоггинг — перехват нажатий клавиш.
  • Распространение вредоносного ПО — перенаправление на заражённые сайты.
  • Совершение действий от имени пользователя — например, перевод средств в интернет-банке.

Защита от XSS в PHP Backend

1. Экранирование выходных данных

Использование функций htmlspecialchars() или htmlentities() для преобразования специальных символов в HTML-сущности.

<?php
$userInput = $_GET['data'];
// Безопасный вывод
echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
?>

2. Валидация и санитизация ввода

Проверка и очистка всех пользовательских данных по белому списку.

// Допустимы только буквы и цифры
if (preg_match('/^[a-zA-Z0-9]+$/', $input)) {
    // Обрабатываем
} else {
    throw new InvalidArgumentException('Недопустимый ввод');
}

3. Использование контекстно-зависимого экранирования

Для разных контекстов (HTML, JavaScript, URL) применяются разные методы.

// Для JavaScript-контекста
$jsData = json_encode($userInput, JSON_HEX_TAG | JSON_HEX_AMP);
echo "<script>var data = $jsData;</script>";

4. HTTP-заголовки Content Security Policy (CSP)

CSP позволяет ограничить источники исполняемых скриптов, что существенно снижает риск XSS.

// Установка CSP заголовка
header("Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com");

5. Использование современных шаблонизаторов

Фреймворки типа Laravel (Blade), Symfony (Twig) автоматически экранируют вывод по умолчанию.

{# Twig автоматически экранирует переменные #}
{{ user_comment }}

Заключение

XSS остаётся критически важной темой для backend-разработчика, поскольку объединяет вопросы безопасности как серверной, так и клиентской части. Защита требует комплексного подхода: строгой обработки ввода, обязательного экранирования вывода, использования современных инструментов и следования принципу минимальных привилегий. Регулярное тестирование на уязвимости (ручное и с помощью сканеров) должно быть неотъемлемой частью процесса разработки и поддержки любого веб-приложения.