Фильтрация данных встроенными фильтрами PHP

Фильтрация данных встроенными фильтрами PHP

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

скачать исходникискачать урок

Функции для фильтрации

Первым делом хотел бы отметить, что для использования функций фильтров, Вам необходим интерпретатор языка PHP версии 5.2 и выше. Ознакомиться с официальной документацией по встроенным фильтрам можно по ссылке https://php.net/manual/ru/book.filter.php.

Начнем изучение с функции filter_list(), которая вернет массив имен доступных фильтров.

<?php
print_r(filter_list());
?>

В результате мы получим следующий массив:

Далее мы можем получить идентификатор интересующего фильтра, передав его имя в функцию filter_id(), которая возвращает идентификатор, принадлежащий именованному фильтру. Конечно, все идентификаторы сохранены в специальных константах, но если Вы забыли имя константы, функция filter_id(), Вам очень пригодится. К примеру, узнаем идентификатор фильтра number_int:

<?php
echo filter_id('number_int');
?>

В результате мы получим число 519 – это соответствует значению константы FILTER_SANITIZE_NUMBER_INT.

При фильтрации, постоянно приходится работать с внешними данными, поэтому изначально необходимо проверить, были ли они переданы. Внешние данные, переданные в скрипт, сохраняются в одном из суперглобальных массивов, к примеру $_POST, или $_GET. Функция filter_has_var() — проверяет существование переменной указанного типа, и возвращает истину в случае успеха.

filter_has_var ( int $type , string $variable_name )

Где, $type – тип переменной, который равен одной из следующих констант INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER (переменная из массива $_POST, $_GET, $_COOKIE, $_SERVER соответственно), string $variable_name – имя переменной (ячейки соответствующего массива).

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

Фильтры валидации данных

Для фильтрации значения переменной переданной из вне, используется функция filter_input($type , $variable_name, $filter = FILTER_DEFAULT, $options), которая принимает внешнюю переменную и, при необходимости, фильтрует ее. Аргументы функции:

$type – тип переменной (равен значению одной из констант рассмотренных выше);

$variable_name – имя интересующей переменной (ячейка суперглобального массива);

$filter – идентификатор фильтра.

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

К примеру, создадим небольшую форму:

<form method="post">
	<input type="text" name="string" />
	<input type="submit">
</form>

В обработчике, отфильтруем значение, которое передается через текстовое поле string:

$options = array(
				'flags'=>"",
				"options"=>array(
							
							)
				);		
if(filter_input(INPUT_POST,'string',FILTER_VALIDATE_BOOLEAN,$options)) {		
	echo "YES";
}
else {
	echo "NO";
}

Как Вы видите я вызвал на исполнение функцию filter_input(), и передал третьим параметром фильтр FILTER_VALIDATE_BOOLEAN, который возвращает TRUE для значений «1″, «true», «on» и «yes», иначе возвращает FALSE. Соответственно если в форме ввести значение 1 – на экране мы увидим строку YES. Если передать в массив
$options флаг FILTER_NULL_ON_FAILURE – фильтр будет возвращать NULL вместо FALSE.

Фильтр валидации email

FILTER_VALIDATE_EMAIL – фильтр возвращает TRUE, если проверяемое значение, является валидным email адресом.

$options = array(
				'flags'=>"FILTER_NULL_ON_FAILURE",
				"options"=>array(
							
							)
				);

Фильтр валидации числа с плавающей точкой

FILTER_VALIDATE_FLOAT – фильтр возвращает TRUE, если передаваемое значение – это правильное число, с плавающей точкой. Данный фильтр поддерживает один флаг FILTER_FLAG_ALLOW_THOUSAND, который разрешает использование разделителей тысяч (по умолчанию это ,).

Фильтр валидации целочисленных значений

FILTER_VALIDATE_INT — Проверяет, что значение является корректным целым числом, и, при необходимости, входит в определенный диапазон. Поддерживает два флага FILTER_FLAG_ALLOW_OCTAL и FILTER_FLAG_ALLOW_HEX, которые разрешают использование чисел восьмеричной и шестнадцатеричной, соответственно, систем исчисления. Помимо этого, фильтр принимает два параметра, то есть диапазон чисел, который должно удовлетворять проверяемое значение.

options = array(
				'flags'=>"",
				"options"=>array(
							'min_range'=>3, 
							'max_range'=>10
							)
				);		
if(filter_input(INPUT_POST,'string',FILTER_VALIDATE_INT,$options)) {		
	echo "YES";
}
else {
	echo "NO";
}

Если в текстовую форму ввести число в диапазоне от 3 до 10, как результат мы получим YES.

Фильтр валидации IP адреса

FILTER_VALIDATE_IP – возвращает истину, если проверяемое значение соответствует IP адресу. Поддерживает следующие флаги:

FILTER_FLAG_IPV4 – IP адрес должен соответствовать адресу формата IPV4;

FILTER_FLAG_IPV6 — IP адрес должен соответствовать адресу формата IPV6;

FILTER_FLAG_NO_PRIV_RANGE – адрес не должен соответствовать диапазону локальных адресов;

FILTER_FLAG_NO_RES_RANGE — запрещает успешное прохождение проверки для зарезервированных адресов.

Фильтр соответствия шаблону регулярного выражения

FILTER_VALIDATE_REGEXP – проверяет, соответствует ли проверяемое значение шаблону регулярного выражения, который передан в массив $options (ячейка ‘regexp’):

<?php
$options = array(
				'flags'=>"",
				"options"=>array(
							'regexp'=>'/^[0-9_]*$/'	
							),
						
				);		
if(filter_input(INPUT_POST,'string',FILTER_VALIDATE_REGEXP,$options)) {		
	echo "YES";
}
else {
	echo "NO";
}	
?>

В данном примере, проверку пройдет строка, состоящая только из цифр.

Фильтр валидации URL

FILTER_VALIDATE_URL – проверяет, соответствует ли строка URL адресу. Поддерживает два флага: FILTER_FLAG_PATH_REQUIRED – URL, обязательно должен содержать полный путь (то есть вместе с доменом сайта, должно быть имя выполняемого файла) и FILTER_FLAG_QUERY_REQUIRED – строка URL, обязательно должна содержать строку с GET параметрами.

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

filter_input_array ($type, $definition, $add_empty = true ) ;

Аргументы функции:

$type – тип проверяемой переменной (дин из INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER);

$definition – массив, определяющий условия фильтрации.

К примеру, если мы передаем методом POST две переменные – number и summ, то для валидации данных полей с помощью функции filter_input_array(), необходимо:

/*$_POST = array(
				['number']=>5,
				['summ']=>10
				);*/
$def = array(
			'number' => FILTER_VALIDATE_INT,
			'summ'=>array(
								'filter'=>FILTER_VALIDATE_FLOAT,
								'flags' => FILTER_FLAG_ALLOW_THOUSAND,
								'options'=>array()
								)
			);
				
var_dump(filter_input_array(INPUT_POST,$def));

Как Вы видите, в функцию, первым параметром, мы передаем константу INPUT_POST, то есть, ожидаем данные, которые будут отправлены запросом POST. А так же создаем массив $def, количество ячеек которого совпадает с количеством ячеек массива $_POST, к тому же имена ячеек так же совпадают с именами массива $_POST.

Фильтры очистки данных

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

filter_var($variable,$filter, $options)

Функция filter_var() – фильтрует переменную с помощью определенного типа и возвращает отфильтрованные данные. Первым параметром необходимо передать имя переменной, которую нужно отфильтровать, вторым – идентификатор фильтра, третьим – массив опций.

К примеру, для фильтрации переменной $number = 5, необходимо выполнить следующее (то есть данная переменная должна содержать только целое число в диапазоне от 1 до 7):

<?php
$number = 5;
$options = array(
				'flags'=>'',
				'options' => array(
							'min_range'=>3, 
							'max_range'=>10
							)
				);
var_dump(filter_var($number,FILTER_VALIDATE_INT, $options));
?>

И вторая функция — filter_var_array ($data, $definition, $add_empty), по своей работе полностью аналогична функции filter_input_array(), за исключением того, что фильтруется массив переменных скрипта.

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

Фильтр очистки email

FILTER_SANITIZE_EMAIL – удаляет символы, которые недопустимы в email адресах, а именно удаляет все символы, кроме букв, цифр и !#$%&’*+-/=?^_`{|}~@.[]. К примеру:

$email = '(admin(собака)admin.ru)';				
echo filter_var($email,FILTER_SANITIZE_EMAIL );

Фильтр кодирования символов

FILTER_SANITIZE_ENCODED — кодирует строку в формат URL, а также при необходимости удаляет или кодирует специальные символы.

Флаги: FILTER_FLAG_STRIP_LOW – удаляет символы ANCII код, которых меньше 32, FILTER_FLAG_STRIP_HIGH – удаляет символы ANCII код, которых больше 122, FILTER_FLAG_ENCODE_LOW– кодирует символы ANCII код, которых меньше 32, FILTER_FLAG_ENCODE_HIGH – кодирует символы ANCII код, которых больше 122.

Фильтр экранирования кавычек

FILTER_SANITIZE_MAGIC_QUOTES – при использовании данного фильтра вызывается функция addslashes().

Фильтры очистки чисел

FILTER_SANITIZE_NUMBER_FLOAT – фильтрует числа с плавающей точкой, а именно удаляет все символы, кроме цифр, +- и, при необходимости, .,eE. Поддерживаются флаги: FILTER_FLAG_ALLOW_FRACTION – точка разделяющая дробную и целую часть не удаляется, FILTER_FLAG_ALLOW_THOUSAND – разделитель тысяч не удаляется FILTER_FLAG_ALLOW_SCIENTIFIC – символы eE – не удаляются.

FILTER_SANITIZE_NUMBER_INT — удаляются все символы, кроме цифр и знаков плюса и минуса.

Фильтры очистки строк

FILTER_SANITIZE_SPECIAL_CHARS – фильтр экранирует HTML-символы ‘»<>& и символы с ASCII-кодом, меньшим 32, при использовании флагов удаляет или кодирует остальные специальные символы. Поддерживаются флаги: FILTER_FLAG_STRIP_LOW, FILTER_FLAG_STRIP_HIGH, FILTER_FLAG_ENCODE_HIGH.

FILTER_SANITIZE_FULL_SPECIAL_CHARS – полностью аналогичен работе функции htmlspecialchars(). Для отключения кодирования кавычек, необходимо использовать флаг FILTER_FLAG_NO_ENCODE_QUOTES.

FILTER_SANITIZE_STRING – данный фильтр удаляет и при использовании флагов, удаляет или кодирует специальные символы. Поддерживает следующие флаги: FILTER_FLAG_NO_ENCODE_QUOTES, FILTER_FLAG_STRIP_LOW, FILTER_FLAG_STRIP_HIGH, FILTER_FLAG_ENCODE_LOW, FILTER_FLAG_ENCODE_HIGH, FILTER_FLAG_ENCODE_AMP. Последний флаг экранирует знак &.
FILTER_SANITIZE_URL – фильтр все символы, которые нельзя использовать в URL, то есть все символы, кроме букв, цифр и $-_.+!*’(),{}|\\^~[]`<>#%»;/?:@&=.

Вот собственно и все, что я хотел Вам сказать в данном уроке. Всего Вам доброго, удачного кодирования и до новых средств!!!

Курс по программированию на языке PHP

Изучите PHP с нуля до результата!

Смотреть курс

Метки: ,

Комментарии Вконтакте:

Комментарии Facebook:

Комментарии (2)

  1. Вячеслав

    Позвольте спросить, а чем эти все фильтры лучше обыденных функций isset(), preg_match(), intval() и прочих?

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Я не робот.

Spam Protection by WP-SpamFree