PHP фильтры и как их использовать

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

Что такое PHP фильтры?

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

Как реализованы фильтры?

PHP фильтры выполняются через 2 функции filter_var() и filter_var_array() и флаги, передаваемые этим функциям. Флаг передаваемый функции определяет, какой фильтр вы хотите использовать.

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

Посмотреть какие фильтры доступны можно с помощью функции filter_list(). Например:

  1. print_r(filter_list());
  2. //выводим на экран...
  3. Array
  4. (
  5. [0] => int
  6. [1] => boolean
  7. [2] => float
  8. [3] => validate_regexp
  9. [4] => validate_url
  10. [5] => validate_email
  11. [6] => validate_ip
  12. [7] => string
  13. [8] => stripped
  14. [9] => encoded
  15. [10] => special_chars
  16. [11] => unsafe_raw
  17. [12] => email
  18. [13] => url
  19. [14] => number_int
  20. [15] => number_float
  21. [16] => magic_quotes
  22. [17] => callback
  23. )

Эти фильтры поддерживаются моим сервером, у вас данные могут быть другими. Рассмотрим несколько примеров, как можно использовать эти фильтры.

Для получения более подробной информации о функциях filter_var() и filter_var_array() обратитесь соответствующим разделам документации PHP

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

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

Вы можете проверить является ли переменная целым числом используя флаг FILTER_VALIDATE_INT. Если является - функция вернет его. В противном же случае вернется False.

  1. $var = 473;
  2. filter_var($var, FILTER_VALIDATE_INT); //вернет 473
  3. $var = 'hello';
  4. filter_var($var, FILTER_VALIDATE_INT); //вернет FALSE
  5. $var = 71.4;
  6. filter_var($var, FILTER_VALIDATE_INT); //вернет FALSE

Для флага FILTER_VALIDATE_INT можно использовать дополнительные параметры: минимум, максимум и значение по умолчанию. Будьте внимательны при определении массива $options array, заметьте, это многомерный массив.

  1. $var_1 = 73;
  2. $var_2 = 246;
  3. $options = array(
  4. 'options' => array(
  5. 'default' => 3,
  6. 'min_range' => 0,
  7. 'max_range' => 99,
  8. )
  9. );
  10. filter_var($var_1, FILTER_VALIDATE_INT, $options); //вернет 73
  11. filter_var($var_2, FILTER_VALIDATE_INT, $options); //вернет 3

Обратите внимание, второй вызов filter_var() вернет 3, так как определенно значение по умолчанию в массиве $options.

Проверка на число с плавающей точкой

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

  1. $var_1 = 45.3;
  2. $var_2 = 246;
  3. filter_var($var_1, FILTER_VALIDATE_FLOAT, $options); //вернет 45.3
  4. filter_var($var_2, FILTER_VALIDATE_FLOAT, $options); //вернет 246

Обратите внимание, что целое число тоже проходит проверку этим фильтром.

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

Вы можете использовать фильтры для проверки более абстрактных типов данных, таких как e-mail.

  1. $var_1 = "test@test.ru";
  2. $var_2 = "какие-то данные, но не e-mail";
  3. filter_var($var_1, FILTER_VALIDATE_EMAIL); //вернет test@test.ru
  4. filter_var($var_2, FILTER_VALIDATE_EMAIL); //вернет FALSE

Однако, этот метод не так хорош, как хорошо написанное регулярное выражение. Так, к примеру, e-mail a@a.a проверку фильтром пройдет, хоть и не должен. Следующее регулярное выражение - более лучшее решение этой проблемы:

  1. $pattern = '/^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$/';
  2. $email_1 = 'test@test.ru';
  3. $email_2 = 'a@a.a';
  4. preg_match($pattern, $email_1); // вернет TRUE
  5. preg_match($pattern, $email_2); //вернет FALSE

Проверка на правильность URL`а

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

  • FILTER_FLAG_SCHEME_REQUIRED
  • FILTER_FLAG_HOST_REQUIRED
  • FILTER_FLAG_PATH_REQUIRED
  • FILTER_FLAG_QUERY_REQUIRED

Взглянем на примеры:

  1. $var_1 = 'http://kron0s.com';
  2. $var_2 = 'http://kron0s.com/path/to/some/file';
  3. $var_3 = 'http://kron0s.com/path/to/some/file/?foo=bar';
  4. $var_4 = 'www.kron0s.com';
  5. $var_5 = 'some_file.html';
  6. $var_6 = "/path/to/some/file";
  7. filter_var($var_1, FILTER_VALIDATE_URL); // вернет http://kron0s.com
  8. filter_var($var_1, FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED); // вернет FALSE
  9. filter_var($var_2, FILTER_VALIDATE_URL); //вернет http://kron0s.com/path/to/some/file
  10. filter_var($var_2, FILTER_VALIDATE_URL, FILTER_FLAG_QUERY_REQUIRED); // вернет FALSE
  11. filter_var($var_3, FILTER_VALIDATE_URL); // вернет http://kron0s.com/path/to/some/file/?foo=bar
  12. filter_var($var_4, FILTER_VALIDATE_URL); // вернет FALSE
  13. filter_var($var_5, FILTER_VALIDATE_URL); // вернет FALSE
  14. filter_var($var_6, FILTER_VALIDATE_URL); // вернет FALSE

Проверка правильности IP адреса

Валидация IP-адресов осуществляется очень просто. используя флаг FILTER_VALIDATE_IP, у которого есть несколько дополнительных параметров. К примеру, вы можете проверять ipv6 адреса.

    FILTER_FLAG_IPV4FILTER_FLAG_IPV6FILTER_FLAG_NO_PRIV_RANGEFILTER_FLAG_NO_RES_RANGE
  1. $var_1 = '192.168.0.1';
  2. $var_2 = '543.152.3.9';
  3. $var_3 = '3ffe:1900:4545:3:200:f8ff:fe21:67cf';
  4. echo filter_var($var_1, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4); // вернет 192.168.0.1
  5. echo filter_var($var_2, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4); // вернет FALSE
  6. echo filter_var($var_3, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6); // вернет 3ffe:1900:4545:3:200:f8ff:fe21:67cf

Заметьте, что 543.152.3.9 вернет false, так как не может быть больше чем 255.255.255.255.

Параметры FILTER_FLAG_NO_PRIV_RANGE и FILTER_FLAG_NO_RES_RANGE позволяют проверить входит ли адрес в диапазон частных или зарезервированных адресов.

PHP фильтры для очистки данных

Очистка строк

Очистка данных осуществляется так же легко как и валидация. Функция filter_var() просто удаляет нежелательные символы и возвращает новые данные. Небольшой пример:

  1. $var_1 = 'какая-то строка';
  2. $var_2 = '"какая-то строка"';
  3. filter_var($var_1, FILTER_SANITIZE_STRING); //вернет какая-то строка
  4. filter_var($var_2, FILTER_SANITIZE_STRING); //вернет "какая-то строка"

Очистка целых чисел

  1. $var_1 = 123214;
  2. $var_2 = '213h34bh312';
  3. filter_var($var_1, FILTER_SANITIZE_NUMBER_INT); //вернет 123214
  4. filter_var($var_2, FILTER_SANITIZE_NUMBER_INT); //вернет 21334312

Использование своих функций в фильтрах

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

  1. function my_rule($str) {
  2. return str_replace(" ", "+", $str);
  3. }
  4. $var_1 = "некая строка с пробелами";
  5. $options = array(
  6. 'options' => 'my_rule'
  7. );
  8. filter_var($var_1, FILTER_CALLBACK, $options); //вернет "некая+строка+с+пробелами"

Заключение

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

Rate It! (Average 5.00, 2 votes)

Related Posts

4 Responses to PHP фильтры и как их использовать

  1. gravatar

    Что-то я не доверяю этим фильтрам, юзаю всегда регулярки, они как-то себя лучше зарекомендовали.

  2. gravatar

    Попробуй так:
    filter_var('http://kron0s', FILTER_VALIDATE_URL,FILTER_FLAG_HOST_REQUIRED);
    filter_var('http://kron0s', FILTER_VALIDATE_URL);
    и поймешь, что еще сыро :)

  3. gravatar

    >Попробуй так:
    >filter_var('http://kron0s', FILTER_VALIDATE_URL,FILTER_FLAG_HOST_REQUIRED);
    >filter_var('http://kron0s', FILTER_VALIDATE_URL);
    >и поймешь, что еще сыро :)

    Это что бы работало на http://localhost и подобных адресах.

  4. gravatar

    @Максим: FILTER_VALIDATE_EMAIL основан на regexp'е, однако он кривой. Предпочитаю Zend_Validate использовать.

Leave a Reply

Mail will not be published