Filter var


Filter varОчень часто приходится сталкиваться с простейшей задачей — валидацией данных из формы или любых других источников (кукисы, заголовок запроса, etc.) И каждый раз 95% разработчиков городят какие-то неимоверные велосипеды (регулярные выражения, «уникальные» алгоритмы хеширования паролей, etc). И каждый раз мне приходится рассказывать о такой невероятно полезной и нужной функции php — filter_var!

Итак, встречаем, встроенная функция валидации данных.

Эта замечательная функция появилась уже давно, в PHP 5.2.0, но до сих пор, очень малый процент разработчиков применяют её, предпочитая свои велосипеды. И это очень зря, ведь Вы используете готовые фреймворки, ORM и другие инструменты? Так почему Вы не валидируете данные встроенными методами?

Filter_var может проверять и очищать какие угодно данные, от булевых значений, до email и url. Есть 3 типа фильтров:

  • Фильтры валидации данных
  • Очищающие фильтры
  • Остальные фильтры

Так же есть ещё флаги, используемые в фильтрах в качестве третьего параметра функции filter_var. Они нужны для уточнения условий валидности. Сегодня мы рассмотрим фильтры валидации данных подробнее.

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

На момент написания статьи, существовало семь валидирующих фильтров:

  • FILTER_VALIDATE_BOOLEAN — проверяет, что значение является корректным булевым значением. Использует неявное приведение типов. Примеры валидных значений: «1», «true», «on», «yes».
  • FILTER_VALIDATE_EMAIL — проверяет, что значение является корректным email.
  • FILTER_VALIDATE_FLOAT — проверяет, что значение является корректным числом с плавающей точкой.
  • FILTER_VALIDATE_INT — проверяет, что значение является корректным целым числом. Дополнительно можно проверить входит ли значение в определенный диапазон.
  • FILTER_VALIDATE_IP — проверяет, что значение является корректным ip-адресом (v4 или v6). Дополнительно можно проверить, что IP соответствует протоколу IPv4 или IPv6, а также отсутствие вхождения в частные или зарезервированные диапазоны.
  • FILTER_VALIDATE_REGEXP — Проверяет значение на соответствие regexp, Perl-совместимому регулярному выражению.
  • FILTER_VALIDATE_URL — проверяет, что значение является корректным url адресом (в соответствии с RFC 2396).

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

Будьте внимательны!

  • FILTER_VALIDATE_INT
    • Числа +0 и -0 не пройдут проверку на целые числа, но пройдут ее на числа с плавающей точкой.
  • FILTER_VALIDATE_URL
    • Корректная ссылка может не содержать HTTP-протокол , т.е. необходима еще одна проверка, определяющая наличие необходимого протокола у ссылки, например, ssh:// или mailto:.
    • Функция работает только с ASCII-ссылками, таким образом, интернациональные доменные имена (содержащие не-ASCII символы) не пройдут проверку.
  • FILTER_VALIDATE_EMAIL
    • Доменная зона не проверяется на реальность, так что адрес вида some@site.mymegazone пройдет валидацию (привет зонам верхнего уровня аля .yandex).

Вот и все. В следующей статье я опишу очищающие фильтры. Далее несколько примеров. Приятного кодинга!

Примеры

  <?  // FILTER_VALIDATE_BOOLEAN  filter_var('on', FILTER_VALIDATE_BOOLEAN); // true  filter_var(true, FILTER_VALIDATE_BOOLEAN); // true  filter_var(1, FILTER_VALIDATE_BOOLEAN); // true  filter_var(0, FILTER_VALIDATE_BOOLEAN); // false  filter_var(false, FILTER_VALIDATE_BOOLEAN); // false  filter_var(false, FILTER_VALIDATE_BOOLEAN,.  

FILTER_VALIDATE_EMAIL); // false // FILTER_VALIDATE_FLOAT filter_var(1, FILTER_VALIDATE_FLOAT); // 1 filter_var(0, FILTER_VALIDATE_FLOAT); // 0 filter_var(1.1, FILTER_VALIDATE_FLOAT); // 1.1 filter_var(true, FILTER_VALIDATE_FLOAT); // 1 filter_var( '1,1', FILTER_VALIDATE_FLOAT, array('options' => array('decimal' => ',')) ); // 1.1 filter_var('1,1', FILTER_VALIDATE_FLOAT); // false filter_var('1,000,000', FILTER_VALIDATE_FLOAT); // false filter_var('1,000,000', FILTER_VALIDATE_FLOAT, FILTER_FLAG_ALLOW_THOUSAND); // 1000000 // FILTER_VALIDATE_INT filter_var(1, FILTER_VALIDATE_INT); // 1 filter_var(0, FILTER_VALIDATE_INT); // 0 filter_var(true, FILTER_VALIDATE_INT); // 1 filter_var('3', FILTER_VALIDATE_INT); // 3 filter_var('3.2', FILTER_VALIDATE_INT); // false filter_var( 22, FILTER_VALIDATE_INT, array('options' => array('min_range' => 30)) ); // false filter_var( 32, FILTER_VALIDATE_INT, array('options' => array('min_range' => 3.

7a0:765d', FILTER_VALIDATE_IP, FILTER_FLAG_IPV6 ); // 2001:0db8:11a3:09d7:1f34:8a2e:07a0:765d // FILTER_FLAG_NO_PRIV_RANGE filter_var('10.0.0.0', FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE); // false filter_var('33.35.73.255', FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE); // 33.35.73.255 // FILTER_FLAG_NO_RES_RANGE filter_var('0.0.0.0', FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE); // false filter_var('10.0.0.0', FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE); // 10.0.0.0 // FILTER_VALIDATE_REGEXP filter_var( 'hello world', FILTER_VALIDATE_REGEXP, array('options'=>array('regexp'=>'/^h/is')) ); // hello world filter_var( 'world hello', FILTER_VALIDATE_REGEXP, array('options'=>array('regexp'=>'/^h/is')) ); // false filter_var( 'hello world', FILTER_VALIDATE_REGEXP, array('options'=>array('regexp'=>'/[0-9]+/is')) ); // false filter_var( '22 543 24', FILTER_VALIDATE_REGEXP, array('options'=>array('regexp'=>'/[0-9]+/i.

FILTER_FLAG_PATH_REQUIRED ); // false filter_var( 'http://somesite.com/test', FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED ); // http://somesite.com/test // FILTER_FLAG_QUERY_REQUIRED filter_var( 'http://somesite.com', FILTER_VALIDATE_URL, FILTER_FLAG_QUERY_REQUIRED ); // false filter_var( 'http://somesite.com?test', FILTER_VALIDATE_URL, FILTER_FLAG_QUERY_REQUIRED ); // http://somesite.com?test // FILTER_FLAG_PATH_REQUIRED | FILTER_FLAG_QUERY_REQUIRED filter_var( 'http://somesite.com/test?test', FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED | FILTER_FLAG_QUERY_REQUIRED ); // http://somesite.com?test ?>

www.phptime.ru

Фильтры данных впервые появились в PHP 5.0, и по какому-то стечению обстоятельств остались незамечеными большй частью кодеров. Наверное, это можно объяснить отсутствием чего-нибудь подобного в PHP4, а может просто мануал плохо читали. Я тоже узнал про них случайно… А ведь эта замечательная функция позволяет избавиться от запутаных, и подчас некорректных, регулярных выражений, при выполнении типичных задач.
Мануал по фильтрам находится здесь. Приведу только основную информацию и пару практичных примеров.

Ближе к делу

Во-первых, фильтры разделены на 3 типа:


  1. Validate Filters — проверяющие фильтры
  2. Sanitize Filters — обезопашивающие фильтры
  3. Other Filters — другие фильтры

Фильтры первого типа проверяют соответствие строки фильтру. Ответ от такого фильтра — исходная строка в случае удачи или false.
Фильтры второго типа обрабатывают строку и возвращают её в отфильтрованном виде.
Третий тип включает только один фильтр — FILTER_CALLBACK, который передаст строку пользовательской функции и вернет её ответ.

Основная функция для работы с фильтрами — filter_var:
mixed filter_var ( mixed $variable [, int $filter = FILTER_DEFAULT [, mixed $options ]] )

Первый параметр — переменная, подлежащая валидации, второй — номер фильтра, который удобно записывается предопределенной константой. Третим параметром можно передать дополнительные опции, как правило — специальные флаги фильтров. Возвращаемое значение зависит от фильтра.

На последок — пара примеров работы:

  // Проверка e-mail  $var = 'mail@example.com';  var_dump(filter_var($var, FILTER_VALIDATE_EMAIL));  $var = 'mail@exa_mple.com';  var_dump(filter_var($var, FILTER_VALIDATE_EMAIL));    // Проверка IP  $var = '2001:471:1f11:251:290:27ff:fee0:2093';  // Это IPv4?  var_dump(filter_var($var, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4));  // Может, это IPv6?  var_dump(filter_var($var, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6));    

habr.com

Расширение фильтра PHP

Фильтры PHP используются для проверки и очистки внешних входных данных.

Расширение фильтра PHP имеет множество функций, необходимых для проверки ввода данных пользователем, разработан, чтобы сделать проверку данных проще и быстрее.

Функция filter_list() может использоваться для перечисления того, что предлагает расширение фильтра PHP:


Зачем Использовать Фильтры?

Многие веб приложения получают внешние входные данные. Внешние input/data могут быть:

  • Пользовательский ввод из формы
  • Cookies
  • Данные веб сервис
  • Серверная переменная
  • Результаты запроса базы данных

Функция filter_var() PHP

Функция filter_var() проверки и очистки данных.

Функция filter_var() фильтрует одну переменную с заданным фильтром. Занимает две части данных:

  • Переменная, которую хотите проверить
  • Тип используемой проверки

Очистить строку

В следующем примере используется функция filter_var(), чтобы удалить все HTML теги из строки:


Проверка целого числа


В следующем примере используется функция filter_var(), чтобы проверить, если переменная $int — целое число.
Если $int — это целое число,выход кода ниже будет: «Целое число допустимо».
Если $int не является целым числом, вывод будет: «Целое число не является действительным»:

Совет: filter_var() и проблема с 0

В приведенном выше примере, если $int был установлен на 0, то функция возвратит «Целое число не является действительным». Для решения этой проблемы используйте следующий код:


Проверка IP адреса

В следующем примере функция filter_var() используется для проверки переменной $ip допустимый IP адрес:


Очистка и проверка адреса электронной почты

В следующем примере функция filter_var() используется для первого удаления всех нелегальные символов из переменной $email, а затем проверяет, если это действительный адрес электронной почты:


Очистка и проверка URL адресов

В следующем примере функция filter_var() используется для первого удаления всех недопустимые символы из URL, а затем проверить, если $URL адрес является допустимым URL адресом:


Полная справочник на фильтр PHP

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

Справочник содержит краткое описание и примеры использования каждой функции!

schoolsw3.com


<?php
// используйте этот формат для фильтров с дополнительными параметрами
$options = array(
    
'options' => array(
        
'default' => 3// значение, возвращаемое, если фильтрация завершилась неудачей
        // другие параметры
        
'min_range' => 0
    
),
    
'flags' 

n>$options);

// для фильтра, который принимает только флаги, вы можете передать их непосредственно
$var filter_var('oops'FILTER_VALIDATE_BOOLEANFILTER_NULL_ON_FAILURE);

// для фильтра, который принимает только флаги, вы также можете передать их как массив
$var filter_var('oops'FILTER_VALIDATE_BOOLEAN,
                  array(
'flags' => FILTER_NULL_ON_FAILURE));

// callback-функция фильтра валидации
function foo($value)
{
    
// Ожидаемый формат: Фамилия, Имена
    
if (strpos($value", ") === false) return false;
    list(
$surname$givennames) = explode(", "$value2);
    
$empty = (empty($surname) || empty($givennames));
    
$notstrings = (!is_string($surname) || !is_string($givennames));
    if (
$empty || $notstrings) {
        return 
false;
    } else {
        return 
$value;
    }
}
$var filter_var('Doe, Jane Sue'FILTER_CALLBACK, array('options' => 'foo'));
?>

php.net

<?php
error_reporting
(E_ALL E_STRICT);
$data = array(
    
'product_id'    => 'libgd<script>',
    
'component'     => '10',
    
'versions'      => '2.0.33',
    
'testscalar'    => array('2''23''10''12'),
    
'testarray'     => '2',
);

$args = array(
    
'product_id'   => FILTER_SANITIZE_ENCODED,
    
'component'    => array('filter'    => FILTER_VALIDATE_INT,
                            
'flags'     => FILTER_FORCE_ARRAY
                            
'options'   => array('min_range' => 1'max_range' => 10)
                           ),
    
'versions'     => FILTER_SANITIZE_ENCODED,
    
'doesnotexist' => FILTER_VALIDATE_INT,
    
'testscalar'   => array(
                            
'filter' => FILTER_VALIDATE_INT,
                            
'flags'  => FILTER_REQUIRE_SCALAR,
                           ),
    
'testarray'    => array(
                            
'filter' => FILTER_VALIDATE_INT,
                            
'flags'  => FILTER_FORCE_ARRAY,
                           )

);

$myinputs filter_var_array($data$args);

var_dump($myinputs);
echo 
"n";
?>

bourabai.ru

Функция Filter_var фильтрует переменную с помощью определенного фильтра.

mixed filter_var( mixed $variable [, int $filter = FILTER_DEFAULT [, mixed $options ]] )

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

Параметр Filter являет собой идентификатор применяемого фильтра. Если не указан, то используется фильтр FILTER_DEFAULT, который по умолчанию не применяет никакого фильтра.

В параметре Options указывается ассоциативный массив параметров либо логическая дизъюнкция (операция ИЛИ) флагов. Если фильтр принимает параметры, флаги могут быть указаны в элементе массива «flags«. Для фильтра «callback» должен быть указан тип callable. Фильтр «callback» должен принимать один аргумент, значение для фильтрации, и возвращать значение после фильтрации.

Список фильтров валидации данных

FILTER_VALIDATE_BOOLEAN. Возвращает TRUE для значений «1«, «true«, «on» и «yes«. Иначе возвращает FALSE. Если установлен флаг FILTER_NULL_ON_FAILURE, то FALSE возвращается только для значений «0«, «false«, «off«, «no» и «», а NULL будет возвращен для всех небулевых значений.

FILTER_VALIDATE_EMAIL. Проверяет, что значение является корректным E-mail. В целом, происходит проверка синтаксиса адреса в соответствии с RFC 822, с тем исключением, что не поддерживаются комментарии, схлопывание пробельных символов и доменные имена без точек.

FILTER_VALIDATE_FLOAT. Проверяет, что значение является корректным числом с плавающей точкой.

FILTER_VALIDATE_INT. Проверяет, что значение является корректным целым числом, и, при необходимости, входит в определенный диапазон.

FILTER_VALIDATE_IP. Проверяет, что значение является корректным IP-адресом, при необходимости только для протоколов Ipv4 (FILTER_FLAG_IPV4) или Ipv6 (FILTER_FLAG_IPV6), а также отсутствие вхождения в частные или зарезервированные диапазоны.

FILTER_VALIDATE_MAC. Проверяет, что значение — это корректный MAC-адрес.

FILTER_VALIDATE_REGEXP. Проверяет значение на соответствие regexp, Perl-совместимому регулярному выражению.

FILTER_VALIDATE_URL. Проверяет значение как URL, опционально с требуемыми компонентами.

Очищающие фильтры

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

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

FILTER_SANITIZE_MAGIC_QUOTES. Применяется функция Addslashes.

FILTER_SANITIZE_NUMBER_FLOAT. Удаляет все символы, кроме цифр, +- и, при необходимости, .,eE.

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

FILTER_SANITIZE_SPECIAL_CHARS. Экранирует HTML-символы ‘»<>& и символы с ASCII-кодом, меньшим 32, при необходимости удаляет или кодирует остальные специальные символы.

FILTER_SANITIZE_FULL_SPECIAL_CHARS. Эквивалентно вызову Htmlspecialchars с установленным параметром ENT_QUOTES.

FILTER_SANITIZE_STRING. Удаляет тэги, при необходимости удаляет или кодирует специальные символы.

FILTER_SANITIZE_URL. Удаляет все символы, кроме букв, цифр и $-_.+!*'(),{}|\^~[]`<>#%»;/?:@&=.

FILTER_UNSAFE_RAW. Бездействует, при необходимости удаляет или кодирует специальные символы. Этот фильтр так же является синонимом FILTER_DEFAULT.

Также существует FILTER_CALLBACK. Вызывается пользовательская функция для фильтрации данных.

Нужно быть крайне внимательным при использовании функции Filter_var и всегда тестировать возвращаемые значение. Если использовать Регулярные выражения в PHP, можно полностью контролировать обработку строки но, возможно, с пониженной скоростью работы.

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

profiphp.ru

<?php
// используйте этот формат для фильтров с дополнительными параметрами
$options = array(
    
'options' => array(
        
'default' => 3// значение, возвращаемое, если фильтрация завершилась неудачей
        // другие параметры
        
'min_range' => 0
    
),
    
'flags' => FILTER_FLAG_ALLOW_OCTAL,
);
$var filter_var('0755'FILTER_VALIDATE_INT$options);

// для фильтра, который принимает только флаги, вы можете передать их непосредственно
$var filter_var('oops'FILTER_VALIDATE_BOOLEANFILTER_NULL_ON_FAILURE);

// для фильтра, который принимает только флаги, вы так же можете передать их как массив
$var filter_var('oops'FILTER_VALIDATE_BOOLEAN,
                  array(
'flags' => FILTER_NULL_ON_FAILURE));

// callback-фильтр валидации
function foo($value)
{
    
// Ожидаемый формат: Фамилия, Имена
    
if (strpos($value", ") === false) return false;
    list(
$surname$givennames) = explode(", "$value2);
    
$empty = (empty($surname) || empty($givennames));
    
$notstrings = (!is_string($surname) || !is_string($givennames));
    if (
$empty || $notstrings) {
        return 
false;
    } else {
        return 
$value;
    }
}
$var filter_var('Doe, Jane Sue'FILTER_CALLBACK, array('options' => 'foo'));
?>

ruhighload.com

Почему проверка ввода имеет важное значение

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

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

Если вы перешли к использованию PHP от другого языка программирования, то у вас вполне могут возникнуть рассуждения: «Зачем заботиться о проверке ввода пользователя?» Но PHP является языком программирования с достаточно свободным синтаксисом. Такое положение делает его отличным инструментом. Но платой за великолепные возможности является трудность контроля данных, потому что практически все можно преобразовать одно в другое.

Почему важно использовать встроенные методы

Для упрощения проверки данных начиная с версии PHP 5.2.0 можно использовать функции filter_input() и filter_var().

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

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

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

 

Несколько примеров

Функция filter_input() появилась в PHP 5.2.0 и позволяет получать внешние переменные и фильтровать их. Очень удобная при работе с данными $_GET и $_POST.

Рассмотрим пример простой страницы, которая читает переданные значения из URL и обрабатывает их. Нам известно, что значения должны быть целым числом в интервале от 15 до 20.

Можно сделать так:

Простой пример, который потребовал достаточно много строк кода.

Во-первых, нужно быть уверенным, что $_GET установлена. Код выполняет соответствующую проверку, чтобы скрипт мог продолжать работать.

Во-вторых, переменная $value содержит «грязные” данные, так как получает их непосредственно из значения $_GET. Нужно выполнить проверку, чтобы можно было использовать $value без риска обрушить все приложение.

Такую проверку пройдет и число 16, так  как функция is_numeric() выдаст true.

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

Сравните выше приведенный код с таким:

filter_input() обрабатывает значение $_GET. Нет нужды беспокоиться о том, чтобы скрипт  получил корректное значение.

Также выполняется проверка  $value перед использованием.

Логика приложения сократилась. Нужно только проверить истинность возвращаемого значения (filter_input() возвращает false, если проверка не прошла, или $_GET["value"] не установлена).

Удобная функция для использования в простых скриптах, чтобы получать данные из $_GET или $_POST, но как быть с классами или функциями? Для таких задач есть функция filter_var().

Функция filter_var() была введена одновременно вместе с функцией filter_input() и имеет такой же функционал.

Опасность здесь заключается в том, что ничто не останавливает функцию  mail() перед отправкой письма по любому значению, которое хранится в переменной $email. При таких попытках произойти может все, что угодно по самому плохому сценарию.

Гораздо более безопасный вариант:

Глядя на выше приведенные примеры, можно решить, что filter_var() или filter_input() используются только для простых проверок. Но в арсенале данных функций есть фильтр FILTER_CALLBACK.

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

 

Некоторые потенциальные недостатки

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

Основной недостаток заключается в том, что функции работают в очень сильной зависимости от фильтров, которые используются для них. Посмотрим на последний пример — фильтр FILTER_VALIDATE_EMAIL изменялся при переходе от версии 5.2.14 к 5.3.3, и есть email адреса, которые являются технически корректными для фильтра, но ущербными для использования. поэтому надо хорошо представлять себе принцип работы используемого фильтра.

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

ruseller.com


You May Also Like

About the Author: admind

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

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

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.