Htmlspecialchars: примеры (PHP)
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);
?><script>alert("test")</script>
Обработка строки с разными контекстами кавычек:
<?php
$str = "A 'quote' and \"double quote\"";
echo htmlspecialchars($str, ENT_NOQUOTES) . "\n";
echo htmlspecialchars($str, ENT_QUOTES) . "\n";
?>A 'quote' and "double quote" A 'quote' and "double quote"
Похожие функции в PHP
Функция htmlentities преобразует все символы, имеющие HTML-сущности. Используется реже, так как может приводить к избыточному кодированию. Основное отличие — обработка широкого набора символов, включая национальные алфавиты.
Функция 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)<script>alert("test")</script>
Htmlspecialchars в Javascript
В JavaScript ручное экранирование или использование контекстных методов фреймворков. Пример ручного подхода:
function escapeHtml(text) {
const map = {
'&': '&',
'"': '"',
"'": ''',
'/': '/'
};
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');
?>ÐÑÐ¸Ð²ÐµÑ <b>миÑ</b>
Изменения в новых версиях PHP
В PHP 8.1 добавлен флаг ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401 как значение по умолчанию для параметра flags. Ранее использовалось значение ENT_QUOTES.
С версии PHP 8.0 параметр encoding может принимать значение null, что означает автоматическое определение кодировки. Ранее требовалось явное указание.
Устарело использование кодировки ISO-8859-1 по умолчанию. Рекомендуется всегда явно указывать UTF-8 или использовать null для автоматического определения.
Расширенные примеры
Массовое экранирование данных из формы перед выводом:
<?php
$form_data = [
'name' => 'John <script>',
'comment' => 'I > you & me'
];
$safe_data = array_map('htmlspecialchars', $form_data);
print_r($safe_data);
?>Array
(
[name] => John <script>
[comment] => I > you & me
)Специальная обработка для атрибутов HTML:
<?php
$value = 'O\'Reilly & Sons';
echo '<input value="' . htmlspecialchars($value, ENT_QUOTES) . '">';
?><input value="O'Reilly & Sons">
Параметр double_encode предотвращает повторное кодирование уже экранированных строк:
<?php
$str = '<b>text</b>';
echo htmlspecialchars($str, ENT_QUOTES, 'UTF-8', false) . "\n";
echo htmlspecialchars($str, ENT_QUOTES, 'UTF-8', true);
?><b>text</b> &lt;b&gt;text&lt;/b&gt;