Безпечне введення
Кожного разу, коли PHP код отримує якісь дані, їх потрібно очищати, тому що передані (вхідні) дані зазвичай можуть бути небезпечними. Перед очищенням дані можна перевірити на відповідність до білого списку, про це читайте у попередньому розділі: перевірка даних .
Декілька прикладів вхідних даних, які потрібно перевіряти та очищати:
- Користувач відправляє дані в WordPress через форму.
- дані імпортуються із внутрішнього або зовнішнього джерела.
- обробляється AJAX запит.
- дані надходять у WordPress через всілякі API.
Очищати чи перевіряти дані потрібно завжди, коли є найменший натяк на нечисті дані.
Очищення даних
Простий спосіб очистити дані, використовувати вбудовані в WordPress функції – це серія допоміжних функцій, що починаються з очищення даних .
Нижче список основних функцій очищення:
- sanitize_email( $email )
- Очищає e-mail: видаляє неприпустимі символи з e-mail адреси.
- sanitize_sql_orderby( $orderby )
- Перевіряє, чи можна використовувати переданий рядок в ORDER BY частини SQL запиту.
- sanitize_text_field( $text )
- Очищає рядок, що передається з поля input (зазвичай при збереженні в базу даних) або при отриманні з БД. Видаляє багато залишаючи тільки текст: без HTML тегів, переносів рядків і т.д.
- sanitize_textarea_field( $text )
- Очищає рядок, що передається з поля textarea (при збереженні в базу даних) або при отриманні з БД. Видаляє всі HTML символи, табуляції, HTML сутності та ін. Залишає чистий текст. З WP версії 4.7.
- sanitize_html_class( $text )
- Підготовляє текст для використання його в HTML атрибуті class: видаляє всі невідповідні символи.
- sanitize_title( $title )
- Використовується для створення ярликів записів/рубрик.
- sanitize_title_with_dashes( $title )
- Очищає заголовок, замінюючи пробіли на (-).
- sanitize_title_for_query( $title )
- Підготовляє рядок для використання її як ярлик (slug) у запиті SQL. Очищення від ін’єкцій проводиться окремо. Мається на увазі, що це назва чого-небудь: заголовка, імені файлу і т.д.
- sanitize_user( $username, $strict )
-
Очищає ім’я користувача (логін, username), видаляючи небезпечні символи.
$strict = true — отже, в іменах будуть доступні тільки:
[a-zA-Z0-9 _*.-] . - sanitize_file_name( $filename )
- Очищає назву файлу, замінюючи пробіли на ‘_’ та видаляючи неприпустимі символи.
- sanitize_key( $key )
-
Очищає рядок, щоб використовувати його як ключ. Ключі використовуються як різні внутрішні ID. Залишить лише:
a-z0-9_-
. - sanitize_mime_type( $mime_type )
-
Очищає рядок для використання його як тип MIME. Видаляє все окрім
-+*.a-zA-Z0-9/
. - sanitize_term_field( $field, $value, $term_id, $taxonomy, $context )
- Очищає значення терміна (рубрики) для використання у тексті.
- sanitize_option( $option, $value )
- Очищає значення різних опцій залежно від типу опції.
- esc_url_raw( $url )
-
Очищає УРЛ для безпечного використання. На відміну від
esc_url() не очищає для безпечного виведення на екран. Використовуйте, коли потрібно отримати НЕкодовану URL-адресу, наприклад: у запитах до БД, при редиректах, в HTTP запитах. - wp_filter_post_kses
- Очищає контент, залишаючи в ньому лише дозволені HTML теги та додає екранні слеші.
- wp_filter_nohtml_kses( $text )
- Видаляє всі HTML теги з переданого тексту. Чекає на екранований рядок. Повертає чистий текст.
приклад
Допустимо, у нас є input поле title.
<input type="text" name="title">
Дані, що одержуються з цього поля, можна очистити за допомогою sanitize_text_field() і зберегти в метаполі запису:
$title = sanitize_text_field( $_POST['title'] ); update_post_meta( $post->ID, 'title', $title );
sanitize_text_field() робить таке:
- Перевіряє помилки у кодуванні UTF-8;
- Конвертує одиночний знак
<
у HTML суть; - Видалять усі теги;
- Видаляє переноси рядків ( rn ), табуляцію ( t ) та невидимі символи пропуску;
- Видаляє прогалини на кінцях рядка.
- Замінює кілька прогалин на одні.
- Видаляє октети:
%[a-f0-9]{2}
.
Обов’язково ознайомтеся зі статтею: Перевірка даних у WordPress .