В чем разница между фильтром esc_html и фильтром attribute_escape?

8

В чем разница между фильтром esc_htmlи attribute_escapeфильтром?

esc_html()использует esc_html filterи esc_attr()использует attribute_escape filter. Оба кодируют <> & "'(меньше, больше, амперсанд, двойная кавычка, одинарная кавычка).

Мне интересно знать, что именно отличает их с точки зрения безопасности (побега).

djadmin
источник
ну, если бы они не отличались друг от друга, не было бы необходимости иметь их обоих ... вопрос IMO просто неясен, это все равно что спрашивать, в чем разница между фильтрами the_content и the_excerpt
Марк Каплун,
1
Я думаю, что он спрашивает, чем они отличаются и почему?
Том Дж. Новелл
@ TomJNowell, хорошо, один вызывается для экранирования атрибутов, а другой для экранирования общего HTML. Это объясняет, почему, и в основном объясняет, как;) Где должен начинаться ответ с объяснения разницы между символами, разрешенными в атрибутах, и общим HTML? это звучит немного слишком просто (но, возможно, это то, о чем спрашивает ОП, наверное)
Марк Каплун,
2
Это было бы хорошо, но пример чего-то esc_attrускользает, что esc_htmlне было бы полезно, в конце концов, почему бы не использовать esc_htmlвезде? Если это очевидно для вас, это может показаться не хорошим вопросом, но для специалиста не очевидно, как эти две функции отличаются, поскольку они обе избегают ожидаемых символов
Том Дж. Новелл

Ответы:

8

Казалось бы, из коробки нет разницы

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. То, что в настоящее время функционально он не изменился, не означает, что в будущем он не изменится после выпуска системы безопасности.

Том Дж Новелл
источник
Спасибо за ответ. Может быть, мне нужно перефразировать мой вопрос. Мне больше интересно узнать, есть ли разница в базовой реализации двух фильтров, упомянутых выше. Это действительно поможет нам (разработчикам) узнать, как экранирование работает в атрибутах и ​​HTML.
djadmin
Эти фильтры не используются Core, они предоставляются для плагинов на случай необходимости. Однако я настоятельно рекомендую не использовать их по соображениям безопасности
Том Дж. Новелл
«Фильтры esc_html и attribute_escape, таким образом, очень опасны». Я действительно не понимаю этот момент. Если мы не используем это, то как мы можем избежать пользовательского ввода для предотвращения XSS?
djadmin
Как вы сказали, они проходят через фильтр перед выходом. Мой оригинальный вопрос - как эти два фильтра отличаются с точки зрения реализации. Я полагаю, что был бы некоторый крайний случай, когда esc_htmlфильтр убегал, а attribute_escapeфильтр - нет, или наоборот.
djadmin
Они не Фильтры предоставляются для стороннего кода и не используются Core. Ядро не подключается к фильтрам и не работает с ними. Эти крайние случаи должны были бы быть написаны разработчиком темы или плагина, и в этот момент это было бы очевидно, если бы вы были тем, кто написал это
Том Дж. Ноуэлл