Функция esc_attr()
используется для экранирования текстовых данных перед выводом в атрибуты HTML-тегов, таких как alt
, value
, title
и другие. Она преобразует специальные символы, такие как <
, >
, &
, "
и '
, в их безопасные HTML-сущности, чтобы предотвратить возможные уязвимости XSS.
esc_attr( string $text ): string
Параметры
$text
(строка, обязательный): Текст, который необходимо экранировать.
Возвращаемое значение
string
: Экранированная строка, готовая для использования в HTML-атрибуте.
Когда использовать
- Используйте
esc_attr()
всегда при выводе данных в атрибуты HTML-тегов. Например, для значений полей форм, таких какinput
,textarea
, и любых других HTML-атрибутов. - Используйте
esc_url()
для экранирования URI в атрибутах, таких какhref
илиsrc
, поскольку толькоesc_attr()
может не защитить от XSS в этих случаях.
Пример 1: Безопасный вывод данных в атрибуте value
Предположим, что у нас есть данные, введенные пользователем, которые сохраняются в переменной $fname
, и мы хотим безопасно вывести их в поле формы.
<?php
$fname = isset($_POST['fname']) ? $_POST['fname'] : '';
?>
<input type="text" name="fname" value="<?php echo esc_attr($fname); ?>">
Этот код экранирует любые специальные символы в пользовательском вводе, предотвращая XSS-атаки.
Пример 2: Правильное использование с URI
Когда мы выводим ссылки или изображения с URL, важно использовать esc_url()
вместо esc_attr()
.
<!-- Правильно: -->
<img src="<?php echo esc_url( $src ); ?>" alt="<?php echo esc_attr( $alt ); ?>">
<!-- Неправильно: -->
<img src="<?php echo esc_attr( $src ); ?>" alt="<?php echo esc_attr( $alt ); ?>">
Пример 3: Пример очистки JSON данных
Функция esc_attr()
может использоваться для экранирования JSON-строк, передаваемых в HTML-атрибуты.
$qargs = [
'per_page' => 50,
'orderby' => [ 'volume_usd' => 'desc' ],
'target_symbol' => 'foo',
];
$json = json_encode( $qargs );
$esc_json = esc_attr( $json );
echo '<input type="hidden" value="' . $esc_json . '">';
Вывод:
<input type="hidden" value="{"per_page":50,"orderby":{"volume_usd":"desc"},"target_symbol":"foo"}">
Пример 4: Экранирование специальных символов
Пример экранирования строки с особыми символами.
$text = "<span>(тег) '(кавычка) \"(двойная кавычка) &(амперсанд)";
echo esc_attr( $text );
// Выведет: <span>(тег) '(кавычка) "(двойная кавычка) &(амперсанд)
Пример 5: Избежание двойного кодирования
Функция esc_attr()
автоматически избегает двойного кодирования сущностей, как показано ниже:
$text = "> and &";
echo esc_attr( $text ); // > and &
Особенности
esc_attr()
предотвращает двойное кодирование: Если строка уже содержит закодированные сущности, они не будут закодированы повторно.- Хук
attribute_escape
: Применяется фильтрattribute_escape
, который можно изменить или дополнить плагинами для дополнительной кастомизации.
Заключение
Функция esc_attr()
— это мощный инструмент для экранирования данных, которые выводятся в HTML-атрибуты, предотвращая возможные уязвимости и XSS-атаки. Ее необходимо использовать при работе с пользовательскими данными, особенно при выводе значений полей формы.