3.2 Валидация данных

Валидация данных – это процесс анализа данных по предопределенному шаблону (или шаблонам) с окончательным результатом: действительным или недействительным.

Обычно это относится к данным, поступающим из внешних источников, таких как пользовательский ввод и запросы к веб-сервисам через API.

Простые примеры валидации данных:

  • Убедитесь, что необходимые поля не оставлены пустыми.
  • Убедитесь, что введенный номер телефона содержит только цифры и знаки препинания.
  • Убедитесь, что введенный почтовый индекс является действительным почтовым индексом.
  • Убедитесь, что количественное поле больше 0

Валидацию данных следует проводить как можно раньше. Это означает, что перед выполнением каких-либо действий необходимо проверить данные.

Валидация может быть выполнена с помощью JavaScript на фронтенде и с помощью PHP на бекэнде.

Проверка данных

Существует как минимум три способа: встроенные функции PHP, основные функции WordPress и пользовательские функции, которые вы пишете.

Встроенные функции PHP

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

  • isset() и empty() для проверки, существует ли переменная и не пуста ли она
  • mb_strlen() или strlen() для проверки, что строка имеет ожидаемое количество символов
  • preg_match(), strpos() для проверки на наличие вхождения одних строк в другие
  • count() для проверки количества элементов в массиве
  • in_array() для проверки, существует ли что-то в массиве

Функции ядра WordPress

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

  • is_email() будет проверять действительность адреса электронной почты
  • term_exists() проверяет, существует ли тег, категория или другой таксономический термин
  • функция username_exists() проверяет, существует ли имя пользователя
  • validate_file() подтвердит, что введенный путь к файлу является реальным путем (но не существует ли файл!)

Проверьте руководство программиста WordPress, чтобы узнать больше о таких функциях.

Поиск функций с подобными названиями: *exists(), *_validate() и is*(). Не все из них являются функциями проверки, но многие из них полезны.

Пользовательские функции PHP и JavaScript

Вы можете написать свои собственные PHP и JavaScript функции и включить их в свой плагин. При написании функции валидации вы захотите назвать ее как вопрос (примеры: is_phone, is_available, is_us_zipcode).

Функция должна возвращать булевое значение, true или false, в зависимости от того, являются ли данные действительными или нет. Это позволит использовать функцию в качестве условия.

Пример 1

Допустим, у вас есть поле ввода почтового индекса США, которое отправляет пользователь.

<input id="wporg_zip_code" type="text" maxlength="10" name="wporg_zip_code">

Текстовое поле позволяет вводить до 10 символов без ограничений по типу используемых символов. Пользователь может ввести что-то действительное, например 1234567890 или что-то недействительное (и злое), например eval().

Атрибут максимальной длины (maxlength) в нашем поле ввода вводится только браузером, поэтому вам все равно придется проверять длину вводимого значения на сервере. Если вы этого не сделаете, атакующий может изменить значение maxlength.

Используя валидацию, мы можем быть уверены, что принимаем только действительные почтовые коды.

Сначала вам нужно написать функцию для валидации американских почтовых индексов:

<?php
function is_us_zip_code($zip_code)
{
    // сценарий 1: empty (пусто)
    if (empty($zip_code)) {
        return false;
    }
 
    // сценарий 2: более 10 символов
    if (strlen(trim($zip_code)) > 10) {
        return false;
    }
 
    // сценарий 3: неверный формат
    if (!preg_match('/^\d{5}(\-?\d{4})?$/', $zip_code)) {
        return false;
    }
 
    // успешно пройден
    return true;
}

При обработке формы ваш код должен проверить поле wporg_zip_code и выполнить действие на основании результата:

if (isset($_POST['wporg_zip_code']) && is_us_zip_code($_POST['wporg_zip_code'])) {
    // выше действие
}

Пример 2

Скажем, вы собираетесь сделать запрос к базе данных для некоторых публикаций, и вы хотите дать пользователю возможность сортировать результаты запроса.

Данный пример кода проверяет входящий ключ сортировки (хранящийся во входном параметре “orderby“) на корректность, сравнивая его с массивом разрешенных ключей сортировки с помощью встроенной PHP-функции in_array. Это предотвращает передачу пользователем вредоносных данных и потенциальную угрозу для сайта.

Перед проверкой входящего ключа сортировки по массиву, ключ передается во встроенную функцию WordPress sanitize_key. Эта функция, помимо прочего, гарантирует, что ключ находится в строчном регистре (in_array выполняет поиск с учетом регистра).

Передача “true” в третий параметр in_array позволяет выполнить строгую проверку типа, которая говорит функции не только сравнивать значения, но и типы значений. Это позволяет коду быть уверенным, что входящий ключ сортировки – это строка, а не какой-то другой тип данных.

<?php
$allowed_keys = ['author', 'post_author', 'date', 'post_date'];
 
$orderby = sanitize_key($_POST['orderby']);
 
if (in_array($orderby, $allowed_keys, true)) {
    // изменить запрос, чтобы отсортировать его по порядковым ключам
}

Наверх ↑