От автора: При создании сайтов или веб-приложений, так или иначе, необходимо фильтровать данные, полученные от пользователя. В первую очередь, это необходимо для обеспечения безопасности, а также для хранения данных в правильном формате. Для этого в версии 5.2 интерпретатора языка PHP была добавлена секция фильтр, что позволяет как фильтровать, так и очищать входные данные. Поэтому в данном уроке мы рассмотрим функции, которые позволяют выполнять фильтрацию данных, а также непосредственно доступные фильтры.
Функции для фильтрации
Первым делом хотел бы отметить, что для использования функций фильтров, Вам необходим интерпретатор языка PHP версии 5.2 и выше. Ознакомиться с официальной документацией по встроенным фильтрам можно по ссылке //php.net/manual/ru/book.filter.php.
Начнем изучение с функции filter_list(), которая вернет массив имен доступных фильтров.
1 2 3 |
<?php print_r(filter_list()); ?> |
В результате мы получим следующий массив:
Далее мы можем получить идентификатор интересующего фильтра, передав его имя в функцию filter_id(), которая возвращает идентификатор, принадлежащий именованному фильтру. Конечно, все идентификаторы сохранены в специальных константах, но если Вы забыли имя константы, функция filter_id(), Вам очень пригодится. К примеру, узнаем идентификатор фильтра number_int:
1 2 3 |
<?php echo filter_id('number_int'); ?> |
В результате мы получим число 519 – это соответствует значению константы FILTER_SANITIZE_NUMBER_INT.
При фильтрации, постоянно приходится работать с внешними данными, поэтому изначально необходимо проверить, были ли они переданы. Внешние данные, переданные в скрипт, сохраняются в одном из суперглобальных массивов, к примеру $_POST, или $_GET. Функция filter_has_var() — проверяет существование переменной указанного типа, и возвращает истину в случае успеха.
1 |
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.
К примеру, создадим небольшую форму:
1 2 3 4 |
<form method="post"> <input type="text" name="string" /> <input type="submit"> </form> |
В обработчике, отфильтруем значение, которое передается через текстовое поле string:
1 2 3 4 5 6 7 8 9 10 11 12 |
$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 адресом.
1 2 3 4 5 6 |
$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, которые разрешают использование чисел восьмеричной и шестнадцатеричной, соответственно, систем исчисления. Помимо этого, фильтр принимает два параметра, то есть диапазон чисел, который должно удовлетворять проверяемое значение.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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’):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?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 параметрами.
С фильтрами валидации, мы закончили, теперь давайте рассмотрим еще одну функцию, которая позволяет выполнять проверку не одной переменной, а целого массива.
1 |
filter_input_array ($type, $definition, $add_empty = true ) ; |
Аргументы функции:
$type – тип проверяемой переменной (дин из INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER);
$definition – массив, определяющий условия фильтрации.
К примеру, если мы передаем методом POST две переменные – number и summ, то для валидации данных полей с помощью функции filter_input_array(), необходимо:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/*$_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.
Фильтры очистки данных
Перед изучением фильтров данной группы, изучим последние две функции, фильтрации данных.
1 |
filter_var($variable,$filter, $options) |
Функция filter_var() – фильтрует переменную с помощью определенного типа и возвращает отфильтрованные данные. Первым параметром необходимо передать имя переменной, которую нужно отфильтровать, вторым – идентификатор фильтра, третьим – массив опций.
К примеру, для фильтрации переменной $number = 5, необходимо выполнить следующее (то есть данная переменная должна содержать только целое число в диапазоне от 1 до 7):
1 2 3 4 5 6 7 8 9 10 11 |
<?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 адресах, а именно удаляет все символы, кроме букв, цифр и !#$%&’*+-/=?^_{|}~@.[]. К примеру:
1 2 |
$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, то есть все символы, кроме букв, цифр и $-_.+!*'(),{}|\\^~[]<>#%»;/?:@&=.
Вот собственно и все, что я хотел Вам сказать в данном уроке. Всего Вам доброго, удачного кодирования и до новых средств!!!
Комментарии (3)