Функция htmlspecialchars()

Тренажер по PHP для пользователей с начальным уровнем подготовки.

Тренажер PHP

Функция htmlspecialchars() — один из главных инструментов защиты веб-приложений от XSS-атак. Когда ты выводишь данные на страницу, особенно если они пришли от пользователя, всегда есть риск, что там окажется что-то вроде <script>alert('hack')</script>. Без обработки браузер выполнит этот код как настоящий JavaScript.

htmlspecialchars() решает эту проблему элегантно: она преобразует специальные HTML-символы в их безопасные эквиваленты — HTML-сущности. После такой обработки <script> превращается в обычный текст, который браузер просто покажет на экране, а не выполнит.

В этом тренажере разберёмся, какие именно символы функция преобразует, как работают её флаги (ENT_QUOTES, ENT_HTML5 и другие), зачем указывать кодировку, и в каких ситуациях без неё не обойтись. Будем исправлять уязвимый код, собирать безопасные конструкции и предсказывать результаты преобразований.

Список тем

1. Базовое преобразование символов

id: 39020_task1

Посмотри на код, который обрабатывает строку с HTML-тегами. Подумай, что именно выведется на экран после применения функции. Обрати внимание, что происходит с угловыми скобками.

Выберите правильный вариант ответа
<?php
$text = "<b>Hello</b>";
echo htmlspecialchars($text);
?>
Сообщения
Проверить
Показать подсказку

2. Защита вывода пользовательских данных

id: 39020_task2

Переменная $username содержит имя, введённое пользователем. Перед выводом на страницу его нужно обезопасить. Заполни пропуски, чтобы код корректно защищал от XSS.

Заполните пропуски
<?php
$username = $_GET['name'];
echo input1S($username);
?>
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

3. Символы и их HTML-сущности

id: 39020_task3

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

Сопоставьте строки в правой(нижней) части с соответствующими строками в левой(верхней) по порядковому номеру
& (амперсанд)
< (меньше)
> (больше)
" (двойная кавычка)
&gt;
&amp;
&quot;
&lt;
Сообщения
Проверить
Показать подсказку

4. Исправь синтаксическую ошибку

id: 39020_task4

В коде допущена ошибка в названии функции. Найди строку с ошибкой и исправь её, чтобы код корректно защищал вывод комментария.

Найдите ошибку и исправьте
<?php
$comment = $_POST['comment'];
$safe = html_specialchars($comment);
echo $safe;
?>
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

5. Флаги функции htmlspecialchars

id: 39020_task5

Функция htmlspecialchars() принимает второй параметр — флаги, которые влияют на её поведение. Распредели флаги по категориям в зависимости от того, какие кавычки они обрабатывают.

Перетяните элементы в соответствующие блоки
Только двойные кавычки
Оба типа кавычек
Кавычки не преобразуются
Стандарт HTML (не про кавычки)
ENT_COMPAT
ENT_QUOTES
ENT_NOQUOTES
ENT_HTML5
ENT_HTML401
Сообщения
Проверить
Показать подсказку

6. Преобразование кавычек с ENT_QUOTES

id: 39020_task6

Посмотри на код и определи, что будет выведено. Обрати внимание на флаг ENT_QUOTES и на то, какие символы он затрагивает.

Что должно получиться?
<?php
$text = "It's a "test"";
echo htmlspecialchars($text, ENT_QUOTES);
?>
Сообщения
Проверить
Показать подсказку

7. Полный вызов с кодировкой

id: 39020_task7

Для надёжной работы htmlspecialchars() рекомендуется указывать кодировку. Собери вызов функции, используя токены из банка. Нужно преобразовать оба типа кавычек и указать кодировку UTF-8.

Нужно правильно расставить в пропуски предложенные варианты
<?php
$user_input = $_GET['data'];
$safe = htmlspecialchars($user_input, input1S, input2S);
echo $safe;
?>
ENT_QUOTES
ENT_COMPAT
ENT_NOQUOTES
'UTF-8'
'ASCII'
true
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

8. Поведение без флага ENT_QUOTES

id: 39020_task8

По умолчанию (без флагов или с ENT_COMPAT) функция ведёт себя определённым образом с кавычками. Что выведет этот код?

Выберите правильный вариант ответа
<?php
$str = "He said 'hello'";
echo htmlspecialchars($str);
?>
Сообщения
Проверить
Показать подсказку

9. Исправь порядок аргументов

id: 39020_task9

Разработчик перепутал порядок аргументов функции. Найди и исправь строку с ошибкой. Правильный порядок: строка, флаги, кодировка.

Найдите ошибку и исправьте
<?php
$title = $_POST['title'];
$safe = htmlspecialchars(ENT_QUOTES, $title, 'UTF-8');
echo "<h1>" . $safe . "</h1>";
?>
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

10. Собери безопасный вывод в атрибуте

id: 39020_task10

Собери код, который безопасно выводит значение в атрибуте value тега input. Значение берётся из $_GET['search']. Используй ENT_QUOTES, так как значение попадает внутрь кавычек атрибута.

Перетяните в правильном порядке строки из одного блока в другой
$safe = htmlspecialchars($search, ENT_QUOTES, 'UTF-8');
<?php
echo '<input type="text" value="' . $safe . '">';
$search = $_GET['search'];
?>
$safe = htmlspecialchars($search);
echo "<input value=$safe>";
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

11. Двойное кодирование

id: 39020_task11

Иногда данные уже содержат HTML-сущности, и повторное применение htmlspecialchars() их испортит. Четвёртый параметр функции контролирует это поведение. Заполни пропуски, чтобы избежать двойного кодирования.

Заполните пропуски
<?php
// Строка уже содержит &
$text = "Tom & Jerry";
// Не хотим получить &amp;
$safe = htmlspecialchars($text, ENT_QUOTES, 'UTF-8', input1S);
echo $safe;
?>
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

12. Порядок обработки пользовательского ввода

id: 39020_task12

Расставь строки в правильном порядке, чтобы получить безопасную обработку комментария пользователя: получение данных, проверка, очистка, сохранение, вывод.

Расставьте строки в правильном порядке
echo htmlspecialchars($comment, ENT_QUOTES, 'UTF-8');
$comment = trim($comment);
<?php
$saved_comment = $comment; // сохранение
$comment = $_POST['comment'];
?>
Сообщения
Проверить
Показать подсказку

13. Комбинация флагов

id: 39020_task13

Флаги можно комбинировать с помощью побитового ИЛИ (|). Определи, что выведет код с комбинацией ENT_QUOTES и ENT_HTML5.

Что должно получиться?
<?php
$s = "5 > 3 & 'yes'";
echo htmlspecialchars($s, ENT_QUOTES | ENT_HTML5, 'UTF-8');
?>
Сообщения
Проверить
Показать подсказку

14. Создание функции-обёртки

id: 39020_task14

Чтобы не писать длинный вызов каждый раз, создай функцию-обёртку h(), которая будет короткой заменой для htmlspecialchars с нужными параметрами. Используй токены из банка.

Нужно правильно расставить в пропуски предложенные варианты
<?php
function h($string) {
    input1S htmlspecialchars($string, input2S, input3S);
}

// Использование:
echo h('<script>alert("XSS")</script>');
?>
return
echo
print
ENT_QUOTES
ENT_COMPAT
'UTF-8'
'ISO-8859-1'
true
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

15. Найди уязвимость XSS

id: 39020_task15

В коде есть уязвимость: один из выводов не защищён. Найди опасную строку и добавь защиту с помощью 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>
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

PHP: запуск кода в браузере

id: 39020_compiler
🐘
Запустить тренажёр (PHP)
НайтиКурс.Ру