Безпечний висновок
У попередніх розділах ми говорили, що дані необхідно перевіряти і очищати на вході, а тут поговоримо чому їх потрібно очищати при виведенні на екран.
Захист даних, що виводяться на екран – це обхід всіляких помилок, які можуть виникнути, якщо дані будуть виведені на екран як є. Наприклад, якщо в рядку є те, що відкриває і немає закриває, то такий рядок може зламати структуру 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 .