WordPress как на ладони
eurobyte.ru - мощные сервера с Дата-центрами в Нидерландах и Москве. От 159 ₽/мес.

Безопасный вывод

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

Защита выводимых на экран данных - это обход всевозможных ошибок, которые могут возникнуть, если данные будут выведены на экран как есть. Например, если в строке есть открывающий и нет закрывающего тега, то такая строка может сломать структуру HTML документа. Или, если в строке, в результате атаки хакера, появился вредоносный JS код внутри <script> тега, код будет выполнен при посещении сайта авторизованным пользователем и сайт будет взломан...

Обход ошибок (escaping) означает удаление нежелательных символов, удаление HTML тегов или преобразование их в символы (HTML сущности) безопасные для вывода.

Очистка на выходе, кроме разных багов с HTML кодом, также защищает от XSS атак.

Очищать данные вывода рекомендуется как можно позднее - прямо перед выводом.

XSS (англ. Cross-Site Scripting — «межсайтовый скриптинг») — тип атаки на веб-сайт, заключающийся во внедрении в веб-страницу вредоносного кода (который выполнит браузер пользователя при открытии им этой страницы). Это одна из самых распространенных видов атак сайтов на WordPress.

Очистка при выводе

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

esc_html( $text )
Заменяет спецсимволы на HTML сущности в переданном тексте, возвращает отформатированный текст. Заменяются следующие символы: &, <, >, ", '.
esc_url( $text )
Очищает УРЛ для использования его в тексте, изменяет неправильные и удаляет опасные символы.
esc_js( $text )
Подготавливает строку для использования в JavaScript. Чтобы уберечь от ошибок: экранирует кавычки, меняет символы (" <> &) на спецсимволы HTML и поправляет окончание строки.
esc_attr( $text )
Преобразует знаки <, >, &, ", ' в html сущности. Не создает двойного преобразования.

Большинство функций WordPress, которые должны вывести данные, делают такую очистку самостоятельно, поэтому не нужно очищать их еще раз. Например, смело, без каких-либо очисток, можно вызывать функцию the_title(), the_content() и т.д.

Немного примеров

Сценарий использования функций очистки вывода очень простой и всегда одинаковый - прямо перед выводом строки, её нужно очистить.

esc_html(), когда строка выводиться в любом HTML теге или без него.

<h4><?php echo esc_html( $title ); ?></h4>

esc_url() для всех URL, включая те, которые находятся в атрибутах href или src.

<img src="<?php echo esc_url( $url ); ?>">

esc_js() для инлайн Javascript.

<a href="#" onclick="<?php echo esc_js( $custom_js ); ?>">Click me</a>

esc_attr() для всего остального, что нужно вывести в атрибутах HTML тега.

<ul class="<?php esc_attr( $list_class ); ?>">

Очистка на выходе и локализация

Для перевода строк - локализации, используются специальные функции: _e(), __() и другие.

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

esc_html_e( 'Hello World', 'text_domain' );
// тоже что
echo esc_html( __( 'Hello World', 'text_domain' ) );

Функции-обертки для локализации и очистки при выводе:

Произвольная очистка перед выводом

Если типу выходных данных не подходит ни одна из существующих функций очистки, то можно использовать функцию wp_kses(). Она позволяет точно указать, какие html теги следует оставить в строке, а какие нужно удалить.

$allowed_html = [
	'a'      => [
		'href'  => [],
		'title' => [],
	],
	'br'     => [],
	'em'     => [],
	'strong' => [],
];

echo wp_kses( $custom_content, $allowed_html );

Система ksess функций в WordPress, также содержит всякие обертки для груп разрешенных тегов. Например wp_kses_post() - это функция обертка для wp_kses(), где $allowed_html - это пакет тегов, используемый по умолчанию для очистки контента записи.

echo wp_kses_post( $post_content );
// тоже что
echo wp_kses( $post_content, 'post' );

Есть и другие wp_kses_* функции, но эти две наиболее подходящие для безопасного вывода данных на экран. Остальные используются ядром WordPress или при очистке получаемых данных.

«kses» функции рекомендуется использовать для очистки вывода, только в крайних случаях, потому что они гораздо медленнее чем функции типа esc_*.

Обязательно ознакомьтесь с подробной статьей о валидации данных в WordPress.

5 комментариев
    Войти