Функция htmlspecialchars() — один из главных инструментов защиты веб-приложений от XSS-атак. Когда ты выводишь данные на страницу, особенно если они пришли от пользователя, всегда есть риск, что там окажется что-то вроде <script>alert('hack')</script>. Без обработки браузер выполнит этот код как настоящий JavaScript.
htmlspecialchars() решает эту проблему элегантно: она преобразует специальные HTML-символы в их безопасные эквиваленты — HTML-сущности. После такой обработки <script> превращается в обычный текст, который браузер просто покажет на экране, а не выполнит.
В этом тренажере разберёмся, какие именно символы функция преобразует, как работают её флаги (ENT_QUOTES, ENT_HTML5 и другие), зачем указывать кодировку, и в каких ситуациях без неё не обойтись. Будем исправлять уязвимый код, собирать безопасные конструкции и предсказывать результаты преобразований.
- Модуль 1: Основы синтаксиса PHP
- Модуль 2: Переменные и типы данных
- Модуль 3: Операторы
- Модуль 4: Условные конструкции
- Модуль 5: Циклы
- Модуль 6: Массивы
- Индексированные массивы.
- Ассоциативные массивы.
- Многомерные массивы.
- Добавление элементов в массив.
- Удаление элементов из массива.
- Функция count().
- Функция array_push() и array_pop().
- Функция array_shift() и array_unshift().
- Функция array_merge().
- Функция array_slice().
- Функция array_splice().
- Функция in_array().
- Функция array_search().
- Функция array_keys() и array_values().
- Функция array_unique().
- Функция array_reverse().
- Сортировка: sort(), rsort().
- Сортировка: asort(), arsort().
- Сортировка: ksort(), krsort().
- Функция array_map().
- Функция array_filter().
- Функция array_reduce().
- Функция array_walk().
- Функция array_column().
- Деструктуризация массивов.
- Iterator интерфейс
- Модуль 7: Функции
- Объявление функций.
- Вызов функций.
- Параметры функций.
- Возврат значений return.
- Значения параметров по умолчанию.
- Передача по значению.
- Передача по ссылке.
- Переменное количество аргументов.
- Оператор распаковки ....
- Типизация параметров.
- Типизация возвращаемых значений.
- Nullable типы.
- Union типы (PHP 8).
- Именованные аргументы (PHP 8).
- Анонимные функции.
- Стрелочные функции.
- Замыкания и use.
- Рекурсивные функции.
- Глобальные переменные в функциях.
- Статические переменные в функциях.
- IteratorAggregate интерфейс
- Модуль 8: Работа со строками
- Одинарные и двойные кавычки.
- Экранирование символов.
- Heredoc и Nowdoc синтаксис.
- Функция strlen().
- Функция substr().
- Функция str_replace().
- Функция strpos() и strrpos().
- Функция explode() и implode().
- Функция trim(), ltrim(), rtrim().
- Функция strtolower() и strtoupper().
- Функция ucfirst() и ucwords().
- Функция str_repeat().
- Функция htmlspecialchars().
- Модуль 9: Суперглобальные переменные
- Модуль 10: Работа с формами
- Модуль 11: Работа с файлами
- Модуль 12: Дата и время
- Модуль 13: Регулярные выражения
- Модуль 14: Сессии и Cookie
- Модуль 15: Include и Require
- Модуль 16: Объектно-ориентированное программирование
- Модуль 17: Пространства имен
- Модуль 18: Обработка ошибок и исключений
- Модуль 19: Работа с JSON и XML
- Модуль 21: PDO - PHP Data Objects
- Модуль 22: Composer и зависимости
- Модуль 23: cURL и HTTP запросы
- Модуль 24: REST API
- Модуль 25: Безопасность
- Модуль 28: Работа с изображениями
- Модуль 29: Отправка email
- Модуль 30: Паттерны проектирования
- Модуль 31: Тестирование
- Модуль 32: Продвинутые возможности PHP 8+
1. Базовое преобразование символов
Посмотри на код, который обрабатывает строку с HTML-тегами. Подумай, что именно выведется на экран после применения функции. Обрати внимание, что происходит с угловыми скобками.
<?php
$text = "<b>Hello</b>";
echo htmlspecialchars($text);
?>2. Защита вывода пользовательских данных
Переменная $username содержит имя, введённое пользователем. Перед выводом на страницу его нужно обезопасить. Заполни пропуски, чтобы код корректно защищал от XSS.
<?php
$username = $_GET['name'];
echo input1S($username);
?>3. Символы и их HTML-сущности
htmlspecialchars() преобразует определённые символы в HTML-сущности. Сопоставь каждый исходный символ с его закодированным представлением.
4. Исправь синтаксическую ошибку
В коде допущена ошибка в названии функции. Найди строку с ошибкой и исправь её, чтобы код корректно защищал вывод комментария.
<?php$comment = $_POST['comment'];$safe = html_specialchars($comment);echo $safe;?>5. Флаги функции htmlspecialchars
Функция htmlspecialchars() принимает второй параметр — флаги, которые влияют на её поведение. Распредели флаги по категориям в зависимости от того, какие кавычки они обрабатывают.
6. Преобразование кавычек с ENT_QUOTES
Посмотри на код и определи, что будет выведено. Обрати внимание на флаг ENT_QUOTES и на то, какие символы он затрагивает.
<?php
$text = "It's a "test"";
echo htmlspecialchars($text, ENT_QUOTES);
?>7. Полный вызов с кодировкой
Для надёжной работы htmlspecialchars() рекомендуется указывать кодировку. Собери вызов функции, используя токены из банка. Нужно преобразовать оба типа кавычек и указать кодировку UTF-8.
<?php
$user_input = $_GET['data'];
$safe = htmlspecialchars($user_input, input1S, input2S);
echo $safe;
?>8. Поведение без флага ENT_QUOTES
По умолчанию (без флагов или с ENT_COMPAT) функция ведёт себя определённым образом с кавычками. Что выведет этот код?
<?php
$str = "He said 'hello'";
echo htmlspecialchars($str);
?>9. Исправь порядок аргументов
Разработчик перепутал порядок аргументов функции. Найди и исправь строку с ошибкой. Правильный порядок: строка, флаги, кодировка.
<?php$title = $_POST['title'];$safe = htmlspecialchars(ENT_QUOTES, $title, 'UTF-8');echo "<h1>" . $safe . "</h1>";?>10. Собери безопасный вывод в атрибуте
Собери код, который безопасно выводит значение в атрибуте value тега input. Значение берётся из $_GET['search']. Используй ENT_QUOTES, так как значение попадает внутрь кавычек атрибута.
$safe = htmlspecialchars($search, ENT_QUOTES, 'UTF-8');<?phpecho '<input type="text" value="' . $safe . '">';$search = $_GET['search'];?>$safe = htmlspecialchars($search);echo "<input value=$safe>";11. Двойное кодирование
Иногда данные уже содержат HTML-сущности, и повторное применение htmlspecialchars() их испортит. Четвёртый параметр функции контролирует это поведение. Заполни пропуски, чтобы избежать двойного кодирования.
<?php
// Строка уже содержит &
$text = "Tom & Jerry";
// Не хотим получить &
$safe = htmlspecialchars($text, ENT_QUOTES, 'UTF-8', input1S);
echo $safe;
?>12. Порядок обработки пользовательского ввода
Расставь строки в правильном порядке, чтобы получить безопасную обработку комментария пользователя: получение данных, проверка, очистка, сохранение, вывод.
echo htmlspecialchars($comment, ENT_QUOTES, 'UTF-8');$comment = trim($comment);<?php$saved_comment = $comment; // сохранение$comment = $_POST['comment'];?>13. Комбинация флагов
Флаги можно комбинировать с помощью побитового ИЛИ (|). Определи, что выведет код с комбинацией ENT_QUOTES и ENT_HTML5.
<?php
$s = "5 > 3 & 'yes'";
echo htmlspecialchars($s, ENT_QUOTES | ENT_HTML5, 'UTF-8');
?>14. Создание функции-обёртки
Чтобы не писать длинный вызов каждый раз, создай функцию-обёртку h(), которая будет короткой заменой для htmlspecialchars с нужными параметрами. Используй токены из банка.
<?php
function h($string) {
input1S htmlspecialchars($string, input2S, input3S);
}
// Использование:
echo h('<script>alert("XSS")</script>');
?>15. Найди уязвимость XSS
В коде есть уязвимость: один из выводов не защищён. Найди опасную строку и добавь защиту с помощью htmlspecialchars и ENT_QUOTES.
<?php$name = $_GET['name'];$safe_name = htmlspecialchars($name, ENT_QUOTES, 'UTF-8');?><p>Привет, <?= $safe_name ?></p><a href="profile.php?user=<?= $name ?>">Профиль</a>