WordPress как на ладони
Шаблоны, плагины и темы для настоящих поклонников Elementor. От TemplateMonster.com wordpress jino

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

Проверка данных (валидация данных), означает рассмотрение входящих данных и проверки того, что они готовы к использованию, прежде чем что-либо с ними делать.

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

«Входящие данные» обычно поступают из формы, предоставленной пользователю, но это также могут быть данные, поступающие от любого внешнего источника, например: RSS-каналы, AJAX запросы, других вызовов API.

Немного примеров валидации данных:

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

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

Несмотря на то, что проверка формы может быть выполнена с помощью JavaScript, прежде чем форма будет отправлена, на такую проверку нельзя полагаться. JavaScript - это клиентская часть и там данные можно подделать, а проверку обойти простым отключением проверяемого скрипта. Поэтому конечную проверку и очистку данных всегда нужно делать именно в PHP после отправки формы.

Про принципы проверки данных читайте в специальной статье про валидацию данных в WordPress.

«Проверка данных» это один из принципов защиты, на ровне с «очисткой данных». Как, наверное, понятно из названий: проверка, проверяет данные прежде чем использовать, а очистка очищает при получении или перед выводом на экран.

Чем проверять входящие данные?

Можно выделить три варианта:

  1. Встроенные в PHP функции.
  2. Функции ядра WordPress.
  3. Пользовательские функции, т.е. ваши функции проверки.

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

Основные проверки выполнимы с помощью многих встроенных в PHP функций, в том числе следующих:

isset( $var )
Проверяет существование переменной.
empty( $var )
Проверяет не пустая ли переменная.
strlen( $string ) и mb_strlen( $string )
Для проверки того, что строка имеет ожидаемое количество символов.
preg_match( $pattern, $subject, $match )
Проверка подстроки в строке по регулярному выражению (маске).
strpos( $haystack, $needle )
Для проверки на предмет наличия подстроки в другой строке.
in_array( $needle, $haystack )
Для проверки, есть ли указанный элемент в указанном массиве.
count( $array )
Для проверки количества элементов в массиве.
filter_var()
Проверяет указанную переменную по условию.

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

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

А ниже список некоторых из них:

is_email( $email )
Проверяет, действителен ли адрес электронной почты.
term_exists( $term )
Проверяет, существует ли тег, категория, или другой термин таксономии.
username_exists( $username )
Проверяет, существует ли имя пользователя.
validate_file( $file, $allowed_files )
Проверяет, что введенный путь к файлу является реальный (путь существует, но не проверяет существование файла).

Также смотрите все функции ядра содержащие exists, validate или is_:

Не все из них являются функциями проверки данных, но подавляющее большинство.

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

Можно написать свои собственные PHP функции и включить их в тему или плагин.

При написании функции проверки, рекомендуется назвать функции вопросительно, например: is_phone(), is_available(), is_us_zipcode().

В конце функции возвращайте булев тип: true/false - это нужно для правильной работы из в условиях.

Пример 1

Пример функции PHP, которая проверяет, является ли значение действующим в США индексом (за пределами США, это называется почтовый код).

function is_us_zipcode( $zipcode ) {
	if ( empty( $zipcode ) ) {
		return false;
	} 

	// a zip code should never have more than 10 characters
	if ( 10 <= strlen( trim( $content ) ) ) {

		// use a regex to check whether this zip code is correct
		if ( preg_match( '/^\d{5}(\-?\d{4})?$/', $content ) ) {
			return true;
		}

	} else {
		return false;
	}
}

Теперь при получении данных поле можно проверить так:

if( isset($_POST['wporg_zip_code']) && is_us_zip_code($_POST['wporg_zip_code']) ){
	// поле проверено, делаем что-либо 
}

Пример 2

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

Этот пример проверяет входящее поле сортировки, указанное в input поле orderby. Вариантов возможных полей сортировки и их можно перечислить - это будет наш белый список для проверки. Проверять этот список будем с помощью php функции in_array().

<?php
$allowed_keys = ['author', 'post_author', 'date', 'post_date'];

// белый список в нижнем регистре (author), 
// поэтому изменим данные, если они указанны в верхнем регистре (AUTHOR)
$orderby = strtolower( $_POST['orderby'] );

if( in_array( $orderby, $allowed_keys, true ) ){
	// проверка пройдена изменяем запрос
}

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

В третьем параметре in_array() мы указали true - это означает что тип данных тоже должен совпадать - должна быть строка. Например, если указать в $_POST['orderby'] = true, а подделать запрос так можно, и не указать проверку по типу, то проверка будет пройдена всегда и мы получим доступ к коду внутри проверки:

if( in_array( true, ['date','author'] ) ){
	// этот код будет срабатывать всегда!
}

-

Про очистку и проверку данных есть отдельная большая статья, обязательно с ней ознакомьтесь!

Комментариев нет
    Здравствуйте, !     Войти . Зарегистрироваться