W3docs

htmlspecialchars()

Функция htmlspecialchars() преобразует специальные символы в соответствующие HTML-сущности. Синтаксис, параметры и примеры использования.

Функция htmlspecialchars() преобразует небольшой набор символов, имеющих специальное значение в HTML, в соответствующие HTML-сущности. Её главная задача — безопасность: при выводе данных, введённых пользователем, на веб-страницу предварительный вызов htmlspecialchars() предотвращает интерпретацию этих данных как разметки или скрипта — стандартная защита от атак межсайтового скриптинга (XSS).

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

Синтаксис

htmlspecialchars(
    string $string,
    int $flags = ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401,
    ?string $encoding = null,
    bool $double_encode = true
): string

Функция принимает один обязательный параметр, $string — строку для преобразования — и три необязательных: $flags, $encoding и $double_encode. Она возвращает преобразованную строку.

Примечание о флаге по умолчанию. Начиная с PHP 8.1 значением $flags по умолчанию является ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401, что кодирует как одинарные, так и двойные кавычки. В PHP 8.0 и более ранних версиях по умолчанию использовался ENT_COMPAT, который оставлял одинарные кавычки без изменений. Если вы поддерживаете более старые версии, всегда передавайте ENT_QUOTES явно, чтобы поведение было предсказуемым.

Какие символы преобразуются

Затрагиваются только пять символов. Всё остальное проходит без изменений:

СимволСущность (с ENT_QUOTES)
& (амперсанд)&
" (двойная кавычка)"
' (одинарная кавычка)'
< (знак «меньше»)&lt;
> (знак «больше»)&gt;

Если вам также нужно кодировать символы с диакритикой, специальные символы и другие символы, не входящие в ASCII, используйте вместо этого htmlentities().

Базовый пример

php— editable, runs on the server

Вывод:

Hello &lt;strong&gt;World&lt;/strong&gt;!

Теги <strong> преобразованы в &lt;strong&gt; и &lt;/strong&gt;. Когда эта строка отправляется в браузер, он отображает буквальный текст <strong>World</strong> вместо того, чтобы отрендерить жирное начертание.

Параметр $flags: обработка кавычек

Второй параметр, $flags, указывает способ обработки кавычек и используемый тип документа. Наиболее распространённый выбор — ENT_QUOTES, который преобразует как одинарные ('), так и двойные (") кавычки. Это важно всякий раз, когда вы помещаете значение внутрь атрибута HTML, поскольку неэкранированная кавычка может преждевременно закрыть атрибут и внедрить новые.

php— editable, runs on the server

Вывод:

I&#039;m a paragraph

Одинарная кавычка преобразована в &#039;. Наиболее распространённые значения флагов:

  • ENT_QUOTES — преобразует как двойные, так и одинарные кавычки (рекомендуется).
  • ENT_COMPAT — преобразует двойные кавычки, оставляя одинарные без изменений.
  • ENT_NOQUOTES — оставляет оба вида кавычек без изменений.
  • ENT_SUBSTITUTE — заменяет недопустимые последовательности кодовых единиц на &#xFFFD; вместо возврата пустой строки.

Параметр $encoding

Третий параметр, $encoding, задаёт кодировку символов входной строки. По умолчанию используется значение параметра INI default_charset (UTF-8 в современных установках). Явное указание кодировки позволяет избежать неожиданностей, если входные данные имеют другую кодировку.

php— editable, runs on the server

Вывод:

Tom &amp; Jerry

Здесь амперсанд кодируется как &amp;, а PHP интерпретирует входные данные как UTF-8. Если кодировка не соответствует фактическим байтам $string, функция может вернуть пустую строку (или символ замены при установленном ENT_SUBSTITUTE).

Параметр $double_encode

Четвёртый параметр, $double_encode, управляет повторным кодированием уже существующих сущностей. По умолчанию он равен true, поэтому строка, уже содержащая &lt;, превращается в &amp;lt;. Установите значение false, чтобы оставлять уже закодированные сущности нетронутыми — это полезно, когда входные данные уже частично экранированы.

php— editable, runs on the server

Вывод:

Hello &lt;strong&gt;World&lt;/strong&gt;!

Существующие сущности &lt; и &gt; остались без изменений, поскольку $double_encode равен false. При значении по умолчанию true те же входные данные привели бы к Hello &amp;lt;strong&amp;gt;....

Защита от XSS на практике

Наиболее важное применение htmlspecialchars() — экранирование любых данных, которые вы не полностью контролируете: данных из форм, значений строк запросов, записей базы данных, поступивших от пользователей — перед их выводом на страницу:

<?php
$comment = $_GET['comment'] ?? '';   // e.g. "<script>alert('xss')</script>"
echo "<p>" . htmlspecialchars($comment, ENT_QUOTES, "UTF-8") . "</p>";
?>

Тег <script> нейтрализуется в &lt;script&gt;...&lt;/script&gt;, поэтому браузер отображает текст вместо его выполнения. Применяйте экранирование в момент вывода, а не при сохранении данных, чтобы исходное значение оставалось доступным для других контекстов.

Обращение преобразования

Чтобы вернуть сущности в исходные символы, используйте htmlspecialchars_decode(). Передайте те же флаги, которые вы использовали при кодировании, чтобы кавычки обрабатывались симметрично.

Связанные функции

  • htmlentities() — аналог htmlspecialchars(), но преобразует все символы, имеющие эквиваленты HTML-сущностей, а не только пять специальных.
  • htmlspecialchars_decode() — обратная функция.
  • strip_tags() — полностью удаляет HTML- и PHP-теги вместо их экранирования.
  • nl2br() — вставляет <br> перед символами новой строки; часто используется после экранирования обычного текста.

Итог

Используйте htmlspecialchars() всякий раз, когда выводите недоверенный текст в HTML. Передавайте ENT_QUOTES и явно указывайте кодировку UTF-8 для предсказуемых и безопасных результатов во всех версиях PHP, выполняйте экранирование в момент вывода и прибегайте к htmlentities() только тогда, когда нужно кодировать все сущности, а не только пять специальных символов.

Практика

Практика
Какова основная задача функции htmlspecialchars() в PHP?
Какова основная задача функции htmlspecialchars() в PHP?
Was this page helpful?