В чем разница между esc_html, esc_attr, esc_html_e и так далее?

13

Я получил ответ от охранника, и он указал, что я должен использовать правильное экранирование пользовательского ввода в моем коде. Итак, я провел некоторое исследование и нашел экранирующие функции.

Какая разница между ними? Когда я должен использовать esc_html()и когда esc_attr()? И когда я должен использовать эти функции _e()в конце?

Baldrick
источник
1
Вы читали документацию ?
Джейкоб Питти
2
Да и это смутило меня еще больше :(
baldrick

Ответы:

21

esc_html()экранирует строку, чтобы она не анализировалась как HTML. Например, <такие символы преобразуются в &lt;. Для читателя это будет выглядеть так же, но это означает, что если выводится значение, <script>оно не будет интерпретироваться браузером как фактический тег сценария.

Используйте эту функцию всякий раз, когда выводимое значение не должно содержать HTML.

esc_attr()экранирует строку, чтобы ее можно было безопасно использовать в атрибуте HTML, class=""например. Это предотвращает выход значения из атрибута HTML. Например, если значение равно "><script>alert();</script>и вы пытались вывести его в атрибуте HTML, он закроет текущий тег HTML и откроет тег сценария. Это небезопасно. Экранируя значение, он не сможет закрыть атрибут и тег HTML и вывести небезопасный HTML.

Используйте эту функцию при выводе значения внутри атрибута HTML.

esc_url() экранирует строку, чтобы убедиться, что это правильный URL.

Используйте эту функцию при выводе значения внутри атрибута href=""или src="".

esc_textarea()экранирует значение, чтобы его можно было безопасно использовать в <textarea>элементе. Экранируя значение с помощью этой функции, он предотвращает <textarea<закрытие <textarea>элемента и вывод его собственного HTML-кода.

Используйте эту функцию при выводе значения внутри <textarea>элемента.

esc_html()а esc_attr()также есть версии, оканчивающиеся на __(), _e()и _x(). Они предназначены для вывода переводимых строк.

WordPress имеет функции, __(), _e()и _x(), для вывода текста , который может быть переведен. __() возвращает переводимую строку, _e() повторяет переводимую строку и _x()возвращает переводимую строку с заданным контекстом. Вы, наверное, видели их раньше.

Поскольку вы не можете доверять файлу перевода, содержащему безопасные значения, использование этих функций при выводе переводимой строки гарантирует, что выводимые строки не могут вызвать ту же проблему, описанную выше.

Используйте эти функции при выводе переводимых строк.

Джейкоб Питти
источник
2
Обратите внимание, что по умолчанию нет разницы между esc_htmlи esc_attr, используется один и тот же код (у них просто другой неиспользуемый фильтр): wordpress.stackexchange.com/questions/264698/…
baptx
4

esc_htmlбудет использоваться внутри HTML, например, между <p>тегом

<p><?php echo esc_html( $some_variable ); ?></p>

esc_attr будет использоваться для экранирования значений атрибутов в HTML-тегах следующим образом:

<p my-attribute="<?php echo esc_attr( $some_variable ); ?>"></p>

применение _eдо конца предназначено для использования его с текстовыми доменами и автоматически отобразит его для вас, например:

<p><?php esc_html_e( 'some-text', 'text-domain' ); ?></p>

<p my-attribute="<?php esc_attr_e( 'some-text', 'text-domain' ); ?>"></p>

в дополнение к _eэтому есть также, __который делает то же самое, _eно не отображает его, поэтому вы можете сохранить его в переменной.

jrmd
источник
2
_eне только для повторения, это для локализации. Поэтому его следует использовать только в том случае, если в функцию передана строка, и она должна содержать текстовый домен. Ваш последний пример неправильно использует это.
Джейкоб Питти
@JacobPeattie мой плохой, я буду обновлять ... РЕДАКТИРОВАТЬ Исправлено
JRMD