• 58599
  • 335
  • 21
Нравится блог?
Подписывайтесь!

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

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

Данным, полученным от пользователя, доверять нельзя.

Что это значит? А это значит то, что если нам нужно, чтобы пользователь ввел число, это совсем не означает, что он введет именно число. Он может ввести что угодно. И поэтому нам необходимо проверить корректность введенных пользователем данных и оградить себя от возможных вследствие этого ошибок и улучшить безопасность наших скриптов.

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

Введение

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

  1. if (function_exists('filter_list'))
  2. {
  3. echo 'список фильтров установлен!';
  4. else {
  5. die('Ошибка: фильтры не найдены.');
  6. }

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

  1. echo "<ul>\n";
  2. $filters = filter_list();
  3. foreach ($filters as $filter)
  4. {
  5. echo "<li>".$filter."</li>\n";
  6. }
  7. echo "</ul>\n";
  • \n";
    $filters = filter_list();
    foreach ($filters as $filter)
    {
    echo "
  • ".$filter."
  • \n";
    }
    echo "



\n";

В результате выполнения этой программы мы получим список фильтров, которыми можем пользоваться.

Три способа фильтрации данных

Существует три основных способа фильтрации входных данных:

  • Validate (проверка) — позволяет проверить и убедиться в том, что введенные данные действительно являются тем, что ожидается. Флаги проверки имеют префикс FILTER_VALIDATE_
  • Sanitize (очистка) — “Очищает” входящие данные. Убирает, экранирует или кодирует недозволенные символы. Флаги очистки начинаются с FILTER_SANITIZE_
  • Flags (флаги) — с помощью флагов вы можете задавать различные варианты поведения фильтров. Флаги бывают как общими для всех фильтров, так и специфические флаги для конкретных фильтров. Обычно они начинаются с FILTER_FLAG_

filter_var($var, FLAG[, FLAGS])

Функция filter_var() принимает как минимум два параметра — имя переменной, которую вы собираетесь фильтровать и флаг. Давайте начнем с примера, который очень часто требуется: валидация (проверка) корректности e-mail адреса. Для этого мы будем использовать функцию filter_var() и флаг FILTER_VALIDATE_EMAIL.

  1. $email = 'fgdjkdgdfghdsdfj';
  2. $vaild_email = filter_var($email, FILTER_VALIDATE_EMAIL);

Результат работы этой функции имеет логический тип(bool) и принимает значение true если строка успешно прошла через фильтр, и false в обратном случае:

  1. if ($valid_email !== false)
  2. {
  3. echo "E-mail адрес корректный";
  4. else {
  5. echo "Некорректный E-mail адрес";
  6. }

Так как fgdjkdgdfghdsdfj — это, конечно же, некорректный e-mail адрес, то фильтр вернет false. Все очень просто, не так ли? Всего лишь вызов одной функции вместо громоздкого регулярного выражения.

Константы фильтров (флаги)

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

  1. $int = 432;
  2. $bool = true;
  3. $float = 432.43;
  4. $reg = "/^([a-zA-Z0-9 ]){4,16}$/";
  5. $url = "http://devolio.com/blog";
  6. $email = 'joey@devolio.com';
  7. $ipaddr = '127.0.0.1';
  8. $ipres = "192.168.0.*";
  9. $ipv6addr = "2001:0db8:85a3:08d3:1319:8a2e:0370:7334";
  10. $string = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234 567890`~!@#$%^&*()-_=+[{]};:'\"<,>.?/|\\n\\r\\t";
  11. $int_octal = decoct(800.82);
  12. $int_hex = dechex(800.82);

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

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

Проверка типа переменной и валидация*

* Валидация дает уверенность в том, что вы получите именно то что надо, или вообще ничего.

FILTER_VALIDATE_INT — проверка на целое число.

  1. $valid_int = filter_var($int, FILTER_VALIDATE_INT);
  2. if ($valid_int !== false)
  3. {
  4. // проверка прошла успешно, $valid_int — целое число
  5. else {
  6. // проверка не прошла
  7. }

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

FILTER_VALIDATE_BOOLEAN — проверка на булево число

FILTER_VALIDATE_URL — проверка на URL-адрес

FILTER_VALIDATE_EMAIL — уже знакомая нам проверка e-mail адреса

FILTER_VALIDATE_IP — проверка IP-адреса

FILTER_UNSAFE_RAW — проверка на небезопасный, "сырой" текст.

Очистка данных

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

FILTER_SANITIZE_STRING — базовая очистка строки. Удаляет символы <>?

  1. $san_string = filter_var($string, FILTER_SANITIZE_STRING);

FILTER_SANITIZE_STRIPPED — базовая очистка строки. Удаляет символы <>?

FILTER_SANITIZE_ENCODED — кодирует символы `~!@#$%^&*()=+[{]};:'".?/| в %hex

FILTER_SANITIZE_SPECIAL_CHARS — кодирует специальные символы <>&" в &type;

FILTER_SANITIZE_EMAIL — убирает символы <>();:,\”

FILTER_SANITIZE_URL — оставляет только a-zA-Z0-9`~!@#$%^&*()-_=+[{]};:'"<,>.?/|

FILTER_SANITIZE_NUMBER_INT — оставляет только 1234567890-+

FILTER_SANITIZE_NUMBER_FLOAT — оставляет только 1234567890-+.

FILTER_SANITIZE_MAGIC_QUOTES — кодирует '”\, точно так же как и magic quotes

Флаги

Флаги — это дополнительные параметры фильтров. Большинство флагов предназначено для конкретных режимов проверки/очистки.

FILTER_FLAG_ALLOW_OCTAL (только для фильтров *_INT) — разрешает восьмеричные цифры для фильтров *_INT.

  1. $allow_octal = filter_var($int_octal, FILTER_SANITIZE_NUMBER_INT, FILTER_FLAG_ALLOW_OCTAL);

FILTER_FLAG_ALLOW_HEX (*_INT filters only) — разрешает шестнадцатиричные цифры для фильтров *_INT.

FILTER_FLAG_STRIP_LOW — вырезает все символы, код которых меньше 32 (ASCII)

FILTER_FLAG_STRIP_HIGH — вырезает все символы с кодами больше 127 (ASCII)

FILTER_FLAG_ENCODE_LOW — кодирует все символы, код которых меньше 32 (ASCII)

FILTER_FLAG_ENCODE_HIGH — кодирует все символы с кодами больше 127 (ASCII)

FILTER_FLAG_NO_ENCODE_QUOTES — игнорирует символы ' и "

FILTER_FLAG_ALLOW_FRACTION (только для фильтров *_NUMBER_FLOAT) — разрешает только 1234567890-+.

FILTER_FLAG_ALLOW_THOUSAND (только для фильтров *_NUMBER_FLOAT) — разрешает только 1234567890-+,

FILTER_FLAG_ALLOW_SCIENTIFIC (только для фильтров *_NUMBER_FLOAT) — разрешает только eE1234567890-+

FILTER_FLAG_SCHEME_REQUIRED (только для VALIDATE_URL) — требует присутствия схемы URL (http://, ftp:// и т.д.)

FILTER_FLAG_HOST_REQUIRED (только для VALIDATE_URL) — требует присутствия URL-хоста

FILTER_FLAG_PATH_REQUIRED (только для VALIDATE_URL) — требует присутствия URL-пути

FILTER_FLAG_QUERY_REQUIRED (только для VALIDATE_URL) — требует присутствия URL строки запроса

FILTER_FLAG_IPV4 (только для VALIDATE_IP) — требует, чтобы IP-адрес был в формате IPV4

FILTER_FLAG_IPV6 (только для VALIDATE_IP) — требует, чтобы IP-адрес был в формате IPV6

FILTER_FLAG_NO_RES_RANGE (только для VALIDATE_IP) — требует, чтобы IP-адрес не был в диапазоне зарезервированных адресов

FILTER_FLAG_NO_PRIV_RANGE (только для VALIDATE_IP) — требует, чтобы IP-адрес не был в диапазоне локальных адресов

FILTER_NULL_ON_FAILURE — Возвращает null вместо пустой строки, если не проходит проверка или какой-нибудь флаг

оригинал

22 сентября 2009, 10:12
11181

Загрузка...
Loading...

Комментарии

rOOse
0
0
Big respect )
Я не знал, теперь не надо свои фильтры писать o_O
web
0
0
Интересный материал, полезно! +1

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

Спасибо за открытие блога в Yvision.kz! Чтобы убедиться в отсутствии спама, все комментарии новых пользователей проходят премодерацию. Соблюдение правил нашей блог-платформы ускорит ваш переход в категорию надежных пользователей, не нуждающихся в премодерации. Обязательно прочтите наши правила по указанной ссылке: Правила

Также можно нажать Ctrl+Enter

Популярные посты

Узаконенное варварство в стране, принимающей «EPXO». Еще далеко нам до «топ-30 развитых стран»

Узаконенное варварство в стране, принимающей «EPXO». Еще далеко нам до «топ-30 развитых стран»

В продвинутых государствах едва ли поймут, почему в столь развитом, успешном и преуспевающем Казахстане от имени и по заданию властей творятся такие зверства над животными.
openqazaqstan
24 мая 2017 / 12:12
  • 10101
  • 100
Поддержим пенсией жиреющие банки! На что казахстанцам разрешат досрочно тратить свои накопления в ЕНПФ

Поддержим пенсией жиреющие банки! На что казахстанцам разрешат досрочно тратить свои накопления в ЕНПФ

Со стороны ЕНПФ в очередной раз прозвучало крайне неоднозначное заявление, от которого, на наш взгляд, лучше было бы воздержаться.
openqazaqstan
23 мая 2017 / 11:08
  • 9371
  • 32
Казком берет комиссии за оплаты по карте. Почему на это закрывают глаза Visa и MasterCard?!

Казком берет комиссии за оплаты по карте. Почему на это закрывают глаза Visa и MasterCard?!

Покупаешь в супермаркете продукты на 5000 тенге и банк забирает себе еще 30-50 тенге. То есть, продукты обошлись уже не в 5000, а в 5050 тенге.
ValentinaVladimirska
25 мая 2017 / 22:56
  • 7515
  • 21
Вырубка деревьев в Алматы под БРТ. Проект уже нанес городу экологический ущерб

Вырубка деревьев в Алматы под БРТ. Проект уже нанес городу экологический ущерб

Как ранее уже сообщалось из-за строительства БРТ в Алматы пострадают значительное количество деревьев. На прошлой неделе вырублены первые вязы и клён, - под расширение проезжей части на улице...
SKYFALL
24 мая 2017 / 17:20
  • 6520
  • 12
Системная коррупция стала главной угрозой для Казахстана. У нас воруют миллиардами

Системная коррупция стала главной угрозой для Казахстана. У нас воруют миллиардами

Коррупционные отношения вышли на такой уровень, что они уже начинают дискредитировать всю систему управления.
openqazaqstan
вчера / 13:45
  • 5170
  • 31
Что бы ни сделал пешеход – все равно водитель сядет

Что бы ни сделал пешеход – все равно водитель сядет

Вопрос о равной ответственности водителя и пешехода при наезде на последних, только-только начинают обдумывать в высоких кабинетах. Но, пока государственные головы думают, водители продолжают...
Mirogloff
22 мая 2017 / 23:29
  • 4891
  • 32
Пока полицейские будут прощать, им будут бить и по чести, и по лицу

Пока полицейские будут прощать, им будут бить и по чести, и по лицу

Судья Алмалинского районного суда Куаныш Арипов ломает стереотипы отношения граждан к представителям Фемиды. Напавшему на полицейского экс-сотруднику алматинского акимата он назначил наказание выше...
Mirogloff
24 мая 2017 / 16:41
  • 3456
  • 9
Да-да, я знаю, пора выходить замуж. Есть ли у меня еще время и, пожалуйста, уточните сколько?

Да-да, я знаю, пора выходить замуж. Есть ли у меня еще время и, пожалуйста, уточните сколько?

Итак давайте сразу начистоту. Мне 29. Не замужем, никогда не была, детей нет. В душе я совсем не чувствую этот возраст. Каждый раз когда задумываюсь об этом больше чем на 3 минуты, меня накрывает...
user2017
23 мая 2017 / 10:57
Аблязов загробным голосом декларирует «ДВК-2». Монолог обиженного человека

Аблязов загробным голосом декларирует «ДВК-2». Монолог обиженного человека

Последний монолог Аблязова о «продолжении борьбы с режимом» и «ДВК-2», при всём желании, не выглядел как какой-то политический манифест.
openqazaqstan
25 мая 2017 / 13:53
  • 2805
  • 60