Безпечний висновок

У попередніх розділах ми говорили, що дані необхідно перевіряти і очищати на вході, а тут поговоримо чому їх потрібно очищати при виведенні на екран.

Захист даних, що виводяться на екран – це обхід всіляких помилок, які можуть виникнути, якщо дані будуть виведені на екран як є. Наприклад, якщо в рядку є те, що відкриває і немає закриває, то такий рядок може зламати структуру HTML документа. Або, якщо в рядку, в результаті атаки хакера, з’явився шкідливий JS код усередині <script> тега, код буде виконаний при відвідуванні сайту авторизованим користувачем і сайт буде зламаний.

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

Очищення на виході, крім різних багів з HTML-кодом, також захищає від XSS атак.

Очищати дані висновку рекомендується якнайпізніше – перед виведенням.

XSS (англ. Cross-Site Scripting — «міжсайтовий скриптинг») — тип атаки на веб-сайт, що полягає у впровадженні на веб-сторінку шкідливого коду (який виконає браузер користувача при відкритті ним цієї сторінки). Це одна з найпоширеніших видів атак сайтів на WordPress.

Очищення під час виведення

Для очищення рядків, що виводяться на екран, в WordPress є спеціальні допоміжні функції, що починаються з див . А нижче наведено основні з них.

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 ); ?>">

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

Для перекладу рядків – локалізації, використовуються спеціальні функції: інші .

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

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 .

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *