WordPress: валидация полей формы

· WordPress, Безопасность и Разработка плагинов · 4 мин чтения

Валидация данных — это процесс, при котором идет проверка данных по определенному сценарию (или паттерну) с определенным результатом: правильно или нет.

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

Несколько примеров, где может пригодиться проверка данных:

  • Проверить если поле не было оставлено пустым
  • Проверить формат телефонного номера
  • Проверить если индекс адреса существует
  • Проверить если поле «количество» больше нуля

Вам нужно проверять поля до того момента как они будут где-либо использоваться, так как могут нанести вред вашему сайту.

Вы можете проверить с клиентской части — JavaScript или со стороны используя PHP.

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

Есть как минимум 3 способа проверка данных: 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_*, например: is_phone, is_available, is_us_zipcode.

Лучше всего предварительно погуглить и проверить на существование нужной вам функции перед её написание, чтобы не тратить время на разработку «велосипеда».

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

Пример первый

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

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

В примере выше, поле разрешает ввод до 10 символов. Пользователь может ввести что угодно, например 123456789 или что-то плохое в виде PHP функции, которая будет запущена во время отображения в админке.

Атрибут maxlength проверяется только в браузере, если пользователь откроет панель разработчика и уберет его, то он сможет ввести больше символов. Тем самым, нам нужно проверять длину строки повторно на стороне сервера.

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

Давайте теперь создадим функцию, которая будет делать эту работу:

<?php
function is_us_zip_code($zip_code)
{
    // сценарий 1: если аргумент дали пустым
    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;
}

Когда вы проверяете форму, ваш код должен проверить поле bologer_zip_code и делать дальнейшее действие в зависимости от результата:

if (isset($_POST['bologer_zip_code']) && is_us_zip_code($_POST['bologer_zip_code'])) {
    // ваше дальнейшее действие
}

Пример второй

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

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

До проверки поля массивом, нужно пустить значение через WordPress функцию sanitize_key. Эта функция проверяет, если ключ в нижнем регистре, так как функция in_array делает проверку только в нижнем регистре.

Когда мы дописываем третий параметр для функции in_array, мы делаем проверку более «жесткой» и проверяем тип переменной. В данном случае, мы проверяем на то, чтобы получение значение было только строкой.

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