Безопасность — это не опция, а необходимость. Если вы создаёте плагин для WordPress, важно понимать, как правильно обрабатывать данные, чтобы не допустить XSS-уязвимостей и инъекций вредоносного кода. В этом материале разберём, как работают функции escaping и sanitizing в WordPress: esc_html(), esc_attr(), esc_url(), esc_js(), wp_kses(), а также функции sanitize_*() для очистки данных перед сохранением в базу.
Почему Escaping так важен
Любая строка, которую вы выводите в браузер, потенциально может содержать вредоносный код.
Например, пользователь вводит в поле вместо текста:
<script>alert('XSS!');</script>
Если этот ввод отобразить на странице без обработки, код выполнится в браузере других пользователей. Это и есть классическая XSS-атака (Cross-Site Scripting).
Чтобы предотвратить подобные ситуации, WordPress предоставляет набор функций для безопасного вывода данных — escaping functions.
Основные функции Escaping в WordPress
Каждая функция эскейпа предназначена для своей конкретной задачи. Использование правильной — критически важно.
1. esc_html()
Используется для очистки HTML-текста перед выводом в контенте.
echo esc_html( $text );
Она преобразует теги (<, >, " и т. д.) в HTML-сущности, чтобы браузер не интерпретировал их как код.
Пример:
$text = '<strong>Цена:</strong> $100';
echo esc_html( $text );
Выведет на странице:
<strong>Цена:</strong> $100
А не сделает слово «Цена» жирным. Таким образом, ваш вывод становится безопасным.
2. esc_attr()
Применяется при выводе данных внутри HTML-атрибутов:
<input type="text" value="<?php echo esc_attr( $value ); ?>">
Если в значении случайно окажутся кавычки или символы >, это не “сломает” разметку.
3. esc_url()
Используется для очистки ссылок (URL).
<a href="<?php echo esc_url( $link ); ?>">Подробнее</a>
Эта функция оставит только допустимые URL-протоколы (http, https, mailto и т. д.), отфильтровав опасные конструкции вроде javascript:.
4. esc_js()
Нужна при вставке данных в JavaScript-код (например, в атрибут onclick):
<button onclick="alert('<?php echo esc_js( $message ); ?>')">OK</button>
Когда нужно оставить HTML, но безопасно
Иногда нам нужно, чтобы HTML-теги отображались как HTML, например в тексте с разметкой.
В этом случае используется функция wp_kses().
echo wp_kses( $content, array(
'em' => array(),
'strong' => array(),
'a' => array( 'href' => array() ),
) );
Второй параметр — это массив разрешённых тегов и их атрибутов. Всё остальное будет вырезано.
Готовые варианты wp_kses
WordPress также предлагает две удобные функции:
wp_kses_post()— разрешает все теги, доступные в редакторе постов (жирный, курсив, ссылки и т.д.);wp_kses_data()— разрешает только те теги, которые можно использовать в комментариях.
Sanitizing: Очистка данных перед сохранением
Если escaping защищает на этапе вывода, то sanitizing используется до сохранения данных в базу.
Он предотвращает запись вредоносного кода или некорректных значений.
Основные функции Sanitizing в WordPress
| Функция | Назначение |
|---|---|
sanitize_text_field() | Очищает текстовые поля, удаляя теги и управляющие символы |
sanitize_email() | Проверяет корректность и очищает e-mail |
sanitize_url() / esc_url_raw() | Валидирует и очищает URL перед сохранением |
sanitize_textarea_field() | Очищает содержимое <textarea> |
intval() / floatval() | Преобразует числовые значения в целые или дробные |
Пример:
$price = sanitize_text_field( $_POST['price'] );
update_option( 'myplugin_price', $price );
Таким образом, даже если пользователь попытается отправить вредоносный код — в базу попадут только безопасные данные.
Переводы и Escaping
Когда вы работаете со строками, которые нужно переводить, используйте функции перевода WordPress (__() и _e()), но в сочетании с escaping.
Вместо:
_e( 'Price', 'myplugin' );
нужно писать:
esc_html_e( 'Price', 'myplugin' );
или, если значение нужно вернуть, а не вывести:
echo esc_html__( 'Price', 'myplugin' );
Эти функции объединяют перевод и эскейпинг в одном вызове.
Когда применять Escaping и Sanitizing
| Этап | Что использовать | Пример |
|---|---|---|
| Перед сохранением данных в БД | Sanitize | sanitize_text_field( $_POST['title'] ) |
| Перед выводом в браузер | Escape | esc_html( $title ) |
| При выводе ссылок | Escape URL | esc_url( $link ) |
| При работе с HTML | wp_kses / wp_kses_post | wp_kses_post( $content ) |
Заключение
Правильное использование функций escape и sanitize — это фундамент безопасности WordPress-плагинов.
Неправильный вывод данных может привести не только к XSS-атакам, но и к полной компрометации сайта.
✅ Запомните правило:
- Перед сохранением — sanitize.
- Перед выводом — escape.
В следующем уроке: мы разберём, как реализовать мультиязычность плагина и правильно организовать систему переводов с использованием .po и .mo файлов