Htmlspecialchars: примеры (PHP)

Экранирование HTML в PHP с помощью htmlspecialchars
Раздел: HTML
htmlspecialchars(string $string, int $flags = ENT_COMPAT | ENT_HTML401, ?string $encoding = null, bool $double_encode = true): string

Основные сведения о htmlspecialchars

Описание функции

Функция htmlspecialchars в PHP преобразует специальные символы в HTML-сущности, предотвращая некорректное отображение и потенциальные XSS-уязвимости. Основное применение — вывод пользовательских данных в HTML-контексте.

Когда используется

Использование функции актуально при выводе любых непроверенных данных в HTML: содержимое форм, комментарии, сообщения. Преобразование выполняется перед вставкой в HTML-разметку, но не перед сохранением в базу данных.

Аргументы функции

Функция принимает четыре параметра: string $string (обрабатываемая строка), int $flags = ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401 (флаги обработки), string|null $encoding = null (кодировка), bool $double_encode = true (двойное кодирование). Кодировка по умолчанию определяется настройками PHP.

Примеры использования htmlspecialchars

Базовое применение

Простое экранирование строки с тегами:

<?php
$text = '<script>alert("test")</script>';
echo htmlspecialchars($text);
?>
&lt;script&gt;alert(&quot;test&quot;)&lt;/script&gt;
Различные флаги

Обработка строки с разными контекстами кавычек:

<?php
$str = "A 'quote' and \"double quote\"";
echo htmlspecialchars($str, ENT_NOQUOTES) . "\n";
echo htmlspecialchars($str, ENT_QUOTES) . "\n";
?>
A 'quote' and &quot;double quote&quot;
A &#039;quote&#039; and &quot;double quote&quot;

Похожие функции в PHP

Функция htmlentities преобразует все символы, имеющие HTML-сущности. Используется реже, так как может приводить к избыточному кодированию. Основное отличие — обработка широкого набора символов, включая национальные алфавиты.

strip_tags

Функция strip_tags полностью удаляет HTML и PHP-теги из строки. Применяется, когда нужно оставить только текст без разметки. Не обеспечивает полной защиты от XSS.

Выбор функции

Для безопасного вывода данных в HTML-контексте предпочтительнее htmlspecialchars. Функция htmlentities используется при необходимости кодирования всех специальных символов. Удаление тегов выполняется через strip_tags только для очистки текста от разметки.

Аналоги в других языках

Htmlspecialchars в Python

В Python используется функция html.escape из стандартного модуля:

import html
result = html.escape('<script>alert("test")</script>', quote=True)
print(result)
&lt;script&gt;alert(&quot;test&quot;)&lt;/script&gt;

Htmlspecialchars в Javascript

В JavaScript ручное экранирование или использование контекстных методов фреймворков. Пример ручного подхода:

function escapeHtml(text) {
  const map = {
    '&': '&amp;',
    '"': '&quot;',
    "'": '&#039;',
    '/': '&#x2F;'
  };
  return text.replace(/[&"'\/]/g, m => map[m]);
}

Htmlspecialchars в MySQL

В MySQL применяются функции REPLACE или XML-функции для экранирования, но обычно обработка выполняется на уровне приложения.

Типичные ошибки

Неправильный порядок обработки

Распространенная ошибка — экранирование перед сохранением в базу данных:

<?php
// Неправильно:
$escaped = htmlspecialchars($user_input);
$db->query("INSERT INTO table VALUES ('$escaped')");
?>

Это приводит к хранению избыточно экранированных данных.

Некорректная кодировка

Несоответствие кодировки в функции и странице вызывает искажения:

<?php
// Страница в UTF-8, но функция использует ISO-8859-1
$str = "Привет <b>мир</b>";
echo htmlspecialchars($str, ENT_QUOTES, 'ISO-8859-1');
?>
ÐÑÐ¸Ð²ÐµÑ &lt;b&gt;миÑ&lt;/b&gt;

Изменения в новых версиях PHP

PHP 8.1

В PHP 8.1 добавлен флаг ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401 как значение по умолчанию для параметра flags. Ранее использовалось значение ENT_QUOTES.

PHP 8.0

С версии PHP 8.0 параметр encoding может принимать значение null, что означает автоматическое определение кодировки. Ранее требовалось явное указание.

PHP 7.4

Устарело использование кодировки ISO-8859-1 по умолчанию. Рекомендуется всегда явно указывать UTF-8 или использовать null для автоматического определения.

Расширенные примеры

Обработка массива данных

Массовое экранирование данных из формы перед выводом:

Пример php
<?php
$form_data = [
  'name' => 'John <script>',
  'comment' => 'I > you & me'
];
$safe_data = array_map('htmlspecialchars', $form_data);
print_r($safe_data);
?>
Array
(
    [name] => John &lt;script&gt;
    [comment] => I &gt; you &amp; me
)
Использование с разными типами кавычек

Специальная обработка для атрибутов HTML:

Пример php
<?php
$value = 'O\'Reilly & Sons';
echo '<input value="' . htmlspecialchars($value, ENT_QUOTES) . '">';
?>
<input value="O&#039;Reilly &amp; Sons">
Отключение двойного кодирования

Параметр double_encode предотвращает повторное кодирование уже экранированных строк:

Пример php
<?php
$str = '&lt;b&gt;text&lt;/b&gt;';
echo htmlspecialchars($str, ENT_QUOTES, 'UTF-8', false) . "\n";
echo htmlspecialchars($str, ENT_QUOTES, 'UTF-8', true);
?>
&lt;b&gt;text&lt;/b&gt;
&amp;lt;b&amp;gt;text&amp;lt;/b&amp;gt;

PHP htmlspecialchars function comments

En
Htmlspecialchars Convert special characters to HTML entities