В чем разница между esc_html, esc_attr, esc_html_e и другими функциями?

7 дек. 2018 г., 17:59:49
Просмотры: 33.7K
Голосов: 23

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

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

2
Комментарии

Вы читали документацию?

Jacob Peattie Jacob Peattie
7 дек. 2018 г. 18:06:35

Да, и это запутало меня еще больше :(

baldrick baldrick
7 дек. 2018 г. 18:10:46
Все ответы на вопрос 2
1
49

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> и вывод собственного HTML.

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

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

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

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

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

7 дек. 2018 г. 18:28:01
Комментарии

Обратите внимание, что по умолчанию нет разницы между esc_html и esc_attr - используется один и тот же код (они просто имеют разные неиспользуемые фильтры): https://wordpress.stackexchange.com/questions/264698/what-is-the-difference-between-esc-html-filter-vs-attribute-escape-filter/264707#264707

baptx baptx
20 июл. 2019 г. 13:11:42
2
10

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, но не выводит текст, позволяя сохранить его в переменной.

7 дек. 2018 г. 18:04:13
Комментарии

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

Jacob Peattie Jacob Peattie
7 дек. 2018 г. 18:12:24

@JacobPeattie моя ошибка, я исправлю... РЕДАКТИРОВАНИЕ Исправлено

jrmd jrmd
7 дек. 2018 г. 18:23:18