Валидация на PHP

Author Автор: Роман Чернышов    Опубликовано: 14 декабря 2011

Речь пойдет о валидации POST или GET данных, хотя принципе это можно отнести и к данным полученным другими способами, например куки. По мере разработки какого либо веб приложения требуется писать интерфейс взаимодействия с пользователями и естественно создавать различные формы для отправки пользователями данных на сервер. например это могут быть комментарии. Думаю всем понятно и очевидно, что пришедшие данные нужно проверять, соответствуют ли они типу, размеру, заданному диапазону. В первую очередь это требуется для безопасности системы, сайта или базы данных, т.к. неправильно переданные данные или умышленно не правильно сформированный запрос может открыть доступ для злоумышленника.

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

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

Немного отступления от темы:
Работа над проектами, разработка и программирование сайтов, скриптов, прочих систем занимает практически всё мое свободное время (по мимо рабочего), иными словами я занимаюсь этим делом максимально возможное количество часов в сутки. Время от времени возникает потребность в тестировании чего либо, ради забавы или просто любопытства. В итоге подобными тестируемыми лабораторными крысами становятся сайты сделанные на скорую руку, на самописных движках или на CMS древних версий. разумеется всё перечисленное страдает от криво написанного кода, нехватки котроля за данными и просто кишит различными багами. Собственно, в большинстве случаем за час моих экспериментов над такими сайтами мне удается найти несколько серьезных уязвимостей и большинство из них кроется в недостаточной валидации пришедших данных. В последнее время часто это встречается в скриптах обрабатывающих POST данные пришедших от JavaScript + Ajax.

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

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

Думаю важность валидации всем понятна. На протяжении длительно времени я писал каждый раз один и тот же кусок кода, затем использовал собственные функции проверки данных, многие из которых были весьма примитивны и как правило разбросаны в разных частях (прииклюденных) файлов. В скором я начал знакомится с PHP фреймворками Zend, CI, Kohana, в каждом из был реализован свой класс для валидации данных, которые я заимствовал для своих проектов. В конце концов я решил заточить один из классов CI под свои нужды, но оказалось, что об этом уже позаботился автор одного из блогов по программированию. Далее делюсь его трудами, а именно модифицированной библиотекой CodeIgniter.

Разберем следующий код:

require_once 'validator.class.php';
 
$validator = new Validator();
$validator->set_rules('name','Ваше имя',array('required' => 'Поле %s обязательно для заполнения','alpha' => 'Поле %s должно содержать только буквы'));
$validator->set_rules('email','Ваш email',array('required' => 'Поле %s обязательно для заполнения','valid_email' => 'Поле %s должно содержать правильный email-адрес'));
 
if($validator->run()){
echo "Валидация прошла успешно";
}
else{
echo $validator->get_string_errors();
}

Как видно из примера, первой строкой мы подключаем файл класса validator.calss.php к нашем скрипту. Далее создаем экземпляр класса и сохраняем объект в переменную $validator.
Затем используя метод $validator->set_rules($field, $label, $rules) задаем поля для валидации.

Данный метод принимает 3 параметра:

  1. $field — имя поля валидации (значение атрибута name в теге <input name=»name» />)
  2. $label — название поля валидации, будет подставляться в сообщения об ошибках
  3. $rules — массив правил валидации, у которого в качестве ключа используется правило валидации, а в качестве значения — сообщение об ошибке для этого правила

После того, как все поля для валидации установлены, запускаем валидатор используя метод $validator->run(). Если валидация прошла успешно, то данный метод вернет значение TRUE, иначе, если есть хоть какие-то ошибки, вернет FALSE.

Для того чтобы получить сообщения об ошибках существует три метода:

  1. get_string_errors() — возвращает все сообщения об ошибках в виде строки
  2. get_array_errors() — возвращает все сообщения в виде массива, где в качестве ключа используется имя поля, а в качестве значения — описание ошибки для этого поля.
  3. form_error($field) — возвращает сообщение об ошибке для поля, переданного в качестве параметра $field

По умолчанию сообщения об ошибках оборачиваются в тег <p></p>. Для того чтобы задать свое оформление используйте метод set_error_delimiters($prefix, $suffix). Например так:

 

Теперь сообщения об ошибках будут оборачиваться в div с классом «error»

Как видите все очень просто.

$validator->set_error_delimiters('
<div class="error">','</div>
');

Для установки правил валидации Вы можете методу set_rules($fields) передать многомерный ассоциативный массив. Давайте посмотрим на пример:

 

$rules = array(
array(
'field' => 'name',
'label' => 'Ваше имя',
'rules' => array(
'required' => 'Поле %s обязательно для заполнения',
'alpha' => 'Поле %s должно содержать только буквы'
)
),
array(
'field' => 'email',
'label' => 'Ваш email',
'rules' => array(
'required' => 'Поле %s обязательно для заполнения',
'valid_email' => 'Поле %s должно содержать правильный email-адрес'
)
)
);
 
$validator->set_rules($rules);

 

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

Итак, какие же правила валидации поддерживает данный класс?

Я вынес в этот класс наиболее распространенные правила валидации, с которыми сталкивается каждый. Вот полный список этих правил:

requiredВозвращает FALSE если поле не заполнено
integerВозвращает FALSE если значение не является целым числом
floatВозвращает FALSE если значение не числового вида
valid_urlВозвращает FALSE если значения не является корректным URL адресом
valid_emailВозвращает FALSE если значения не является корректным e-mail адресом
valid_ipВозвращает FALSE если IP-адрес не является действительным
matches[field]Возвращает FALSE если элемент не соответствует значению другого элемента field
alphaВозвращает FALSE если элемент содержит не только буквы
valid_captcha[field]Возвращает FALSE если значение в сессии field не равно значению поля формы
valid_dateВозвращает FALSE если элемент содержит не корректную дату

Большинство этих правил используют фильтры, которые стали доступны в PHP 5.

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

Для того чтобы получить обработанное значение POST данных используется метод:

$validator->postdata($field);

Вместо $field подставляется нужный ключ POST данных.

А для того, чтобы очистить все значения POST данных используется метод:

$validator->reset_postdata($field);

 

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

Часть данного поста я все же скопипастил, т.к. всё переписывать нет желания да и смысла. Возможно кто-то скажет, а зачем же вообще писать заново пост и приводить в нем частично копипаст если можно просто поделиться ссылкой? Дело в то, что данный PHP класс взят за основу класса валидации для Rche CMS над которой я веду работы уже несколько месяцев.

1 Comment to “Валидация на PHP”

  • Руслан 18.06.2023 в 6:44 пп

    Спасибо за пример я скопировал его себе. Желаю успехов и мира, а остальным привет от максима кво мастера )))

Оставить комментарий

Автор блога
Роман Чернышов
Веб-разработчик,
Full Stack
Senior, Architect
PHP, JavaScript, Node.JS, Python, HTML 5, CSS 3, MySQL, Bash, Linux Admin
Заказать работу
предложить оффер

Моя книга
Книга. Веб-разработчик. Легкий вход в профессию
Печатная книга
Веб-разработчик.
Легкий вход в профессию
Купить за 159₽
Последние вопросы
Список вопросов
Последние комментарии
Меню

Archive

Мои проекты
Insurance CMS Love Crm CMS Совместные покупки Мой PHP Framework Хостинг для моих клиентов Лицензии на мой софт и поддержка