Казалось бы, из коробки нет разницы
function esc_html( $text ) {
$safe_text = wp_check_invalid_utf8( $text );
$safe_text = _wp_specialchars( $safe_text, ENT_QUOTES );
/**
* Filters a string cleaned and escaped for output in HTML.
*
* Text passed to esc_html() is stripped of invalid or special characters
* before output.
*
* @since 2.8.0
*
* @param string $safe_text The text after it has been escaped.
* @param string $text The text prior to being escaped.
*/
return apply_filters( 'esc_html', $safe_text, $text );
}
function esc_attr( $text ) {
$safe_text = wp_check_invalid_utf8( $text );
$safe_text = _wp_specialchars( $safe_text, ENT_QUOTES );
/**
* Filters a string cleaned and escaped for output in an HTML attribute.
*
* Text passed to esc_attr() is stripped of invalid or special characters
* before output.
*
* @since 2.0.6
*
* @param string $safe_text The text after it has been escaped.
* @param string $text The text prior to being escaped.
*/
return apply_filters( 'attribute_escape', $safe_text, $text );
}
Единственная разница между двумя функциями - это фильтр, применяемый в конце. WordPress ничего не добавляет к этим фильтрам, поэтому при стандартной установке WP они не работают. Они предоставлены в крайнем случае, что кому-то они могут понадобиться.
Быстрый Q & A
Так по умолчанию они идентичны?
Да! Функции esc_attr
и esc_html
имеют одинаковую реализацию
Фильтры идентичны?
Разница лишь в том, что у них разные имена, они работают одинаково, они используются одинаково, и ни один фильтр не используется в ядре.
Фильтры что-нибудь делают?
Нет! Все экранирование выполняется в функции, когда wp_check_invalid_utf8
и _wp_specialchars
вызываются.
Фильтры не делают экранирования, они позволяют плагинам выполнять дополнительные проверки и обработку.
Есть ли крайние случаи?
Только если вы используете фильтры, скажем, вы подключены, esc_html
но не подключены attribute_escape
, или наоборот. Для стандартной установки WP две функции идентичны, без разницы.
Почему attribute_escape
и нет esc_attr
?
Обратная совместимость. Раньше была attribute_escape
функция, которая теперь помечена как устаревшая после esc_
добавления функций стиля.
Зачем мне использовать эти фильтры?
¯\_(ツ)_/¯
это было бы редкой ситуацией. Некоторые люди могут злоупотреблять им так же, как и API-интерфейсы перевода для поиска и замены текста. Это уже плохая практика, так как эти фильтры часто называют малыми потерями в скорости, которые увеличиваются в тысячи раз.
Но учтите, что если вы не будете осторожны, вы можете поставить под угрозу безопасность этих функций, отменив экранирование, которое они добавили, или добавив неэкранированный контент в конце. По этой причине фильтры опасны.
Нужно ли беспокоиться об этом?
Нет. Вам нужно беспокоиться, только если вы использовали эти фильтры, которые сами по себе должны были вызвать массивные красные сигналы тревоги, что что-то в вашей разработке пошло не так.
Функции esc_attr
и esc_html
безопасны в использовании, и экранируют контент. У вас есть этическое и моральное обязательство использовать их, если вы цените безопасность своего кодекса
Значит ли это, что я должен просто использовать esc_html
?
Нет, побег - это все, что связано с ожиданиями. Если вы ожидаете атрибут, используйте esc_attr
. То, что в настоящее время функционально он не изменился, не означает, что в будущем он не изменится после выпуска системы безопасности.