Htmlentities: примеры (PHP)
htmlentities(string $string, int $flags = ENT_COMPAT | ENT_HTML401, ?string $encoding = null, bool $double_encode = true): stringФункция htmlentities преобразует специальные символы в соответствующие HTML-сущности. Она находит применение при выводе пользовательских данных в HTML-контексте для предотвращения XSS-атак и корректного отображения текста.
Использование функции актуально при отображении в браузере данных, полученных от пользователя или из внешних источников. Это гарантирует, что символы, имеющие специальное значение в HTML (например, <, >, &, "), будут отображены как текст, а не интерпретированы браузером как разметка.
Функция имеет следующую сигнатуру: htmlentities(string $string, int $flags = ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401, ?string $encoding = null, bool $double_encode = true): string
- $string – обрабатываемая строка.
- $flags – комбинация констант, определяющих правила обработки. Основные: ENT_COMPAT, ENT_QUOTES, ENT_NOQUOTES, ENT_HTML401, ENT_XML1, ENT_XHTML, ENT_HTML5, ENT_SUBSTITUTE, ENT_DISALLOWED.
- $encoding – кодировка строки (например, 'UTF-8'). Если null, используется внутренняя кодировка.
- $double_encode – если false, уже существующие HTML-сущности не будут преобразованы повторно.
<?php
$text = '<script>alert("test")</script> & "цитата"';
echo htmlentities($text);
?><script>alert("test")</script> & "цитата"
<?php
$str = "'одинарная' и \"двойная\" кавычка";
echo htmlentities($str, ENT_NOQUOTES) . "\n";
echo htmlentities($str, ENT_COMPAT) . "\n";
echo htmlentities($str, ENT_QUOTES);
?>'одинарная' и "двойная" кавычка 'одинарная' и "двойная" кавычка 'одинарная' и "двойная" кавычка
<?php
// Строка с недопустимым UTF-8 символом
$str = "\x80Привет";
echo htmlentities($str, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
?>�Привет
- htmlspecialchars() – преобразует только специальные символы HTML (<, >, &, "), в то время как htmlentities преобразует все символы, имеющие HTML-сущности. htmlspecialchars используется чаще для защиты от XSS.
- strip_tags() – полностью удаляет HTML и PHP-теги из строки, но не экранирует их. Подходит для полного очищения текста от разметки.
- addslashes() – экранирует кавычки, но для SQL-запросов следует использовать подготовленные выражения, а для HTML – htmlentities или htmlspecialchars.
Выбор функции зависит от задачи. Для безопасного вывода пользовательского текста в HTML-поле страницы обычно применяют htmlspecialchars. Функция htmlentities уместна, когда необходимо сохранить отображение всех специальных символов, например, при выводе текста с множеством символов валют или математических обозначений.
Htmlentities в Javascript
В JavaScript нет встроенной точной копии htmlentities, но для похожих целей используют textContent при вставке в DOM или создают элемент и устанавливают текст.
// Пример с textContent
document.getElementById('output').textContent = userInput;
// Или с использованием функции
function escapeHtml(text) {
const div = document.createElement('div');
div.textContent = text;
return div.innerHTML;
}Htmlentities в Python
В Python для этого применяют функцию html.escape() из модуля html.
import html
text = '<script>alert(\"x\")</script>'
escaped = html.escape(text, quote=True)
print(escaped) # <script>alert("x")</script>Htmlentities в MySQL
В MySQL прямой аналогии нет. Для безопасной вставки данных в HTML используется экранирование на уровне языка приложения (например, через PHP). Функции типа QUOTE предназначены для SQL-синтаксиса.
<?php
// Если строка в кодировке Windows-1251, а указана UTF-8
$str = mb_convert_encoding("Привет", 'Windows-1251', 'UTF-8');
echo htmlentities($str, ENT_QUOTES, 'UTF-8'); // Может вывести некорректно
?>�������� (или пустой вывод с ENT_SUBSTITUTE)
<?php
$str = '&';
echo htmlentities($str); // По умолчанию $double_encode = true
?>&amp;
<?php
$attr = '" onmouseover="alert(1)';
$html = '<input value="' . htmlentities($attr, ENT_COMPAT) . '">';
echo $html;
?><input value="" onmouseover="alert(1)"> // Уязвимость осталась
- В PHP 8.1 поведение функции htmlentities() и htmlspecialchars() было изменено: по умолчанию они теперь заменяют недопустимые символы кодовой единицы UTF-8 символом замены Unicode U+FFFD (или �) при использовании флага ENT_SUBSTITUTE. Ранее они возвращали пустую строку.
- В PHP 8.0 параметр $encoding стал необязательным (nullable), значение по умолчанию – null.
- Начиная с PHP 5.4, кодировка по умолчанию изменилась с ISO-8859-1 на UTF-8.
<?php
$str = '<tag> "цитата" &';
// Для HTML5
echo htmlentities($str, ENT_QUOTES | ENT_HTML5, 'UTF-8') . "\n";
// Для XML
echo htmlentities($str, ENT_QUOTES | ENT_XML1, 'UTF-8');
?><tag> "цитата" & <tag> "цитата" &
<?php
$str = '<div> уже экранировано &';
echo htmlentities($str, ENT_QUOTES, 'UTF-8', false);
?><div> уже экранировано &
<?php
$data = ['message' => "<script>alert('test')</script>"];
$json = json_encode($data);
?>
<script>
var data = <?php echo htmlentities($json, ENT_QUOTES, 'UTF-8'); ?>;
</script><script>
var data = {"message":"<script>alert('test')</script>"};
</script><?php
// Символ, недопустимый в HTML 4.01 (например, управляющий символ)
$str = "Привет\x00 мир";
echo htmlentities($str, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8');
?>Привет мир