• 60571
  • 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
11215

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

Комментарии

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

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

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

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

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

Юрист, пришедший в школу учителем по зову души, о главной проблеме системы образования

Юрист, пришедший в школу учителем по зову души, о главной проблеме системы образования

Алматинский учитель поставил диагноз системе, частью которой является образование. Будучи успешным юристом, имевший степень МВА, он вдруг развернул траекторию своей карьеры, став обычным учителем.
Zhumanova
22 сент. 2017 / 16:26
  • 10007
  • 19
«Это будут твои большие похороны». Гуф высказался о Скриптоните и Басте

«Это будут твои большие похороны». Гуф высказался о Скриптоните и Басте

Досталось и Скриптониту, который ранее опубликовал запись, о том, что больше не будет сниматься в клипе Гуфа и Тимати. "Я тебя ни о чем больше не попрошу, казах ты мой дорогой" - высказался рэпер.
tala03
21 сент. 2017 / 15:48
  • 4388
  • 12
«Честный взгляд» госслужащего: «Знала бы, что ты такой гнилой, я бы тебя не брала»

«Честный взгляд» госслужащего: «Знала бы, что ты такой гнилой, я бы тебя не брала»

Мы не такие блатные. Да, нас унижают руководители, возомнившие себя ханами, часто наши права не реализуются в должной мере. И я всегда задавался, почему на самом деле нет нормальных условий и льгот...
WriterKz
23 сент. 2017 / 0:41
Почему депутат Божко хочет ограничить приток сельской молодёжи в города?

Почему депутат Божко хочет ограничить приток сельской молодёжи в города?

Вице-спикер Мажилиса Владимир Божко остановился на некоторых деталях известного конфликта в Астане возле строящегося «Абу Даби Плаза», затронув проблему «многочисленной сельской молодёжи»...
openqazaqstan
19 сент. 2017 / 13:16
  • 2948
  • 69
Астана перестает быть городом-музеем, или Почему я хотел бы жить в столице

Астана перестает быть городом-музеем, или Почему я хотел бы жить в столице

Наш главный город страны стал избавляться от уже вполне неуместных моветонных клише, которые громоздились над ней, как черное облако над Мордором.
tentser
22 сент. 2017 / 21:04
  • 2021
  • 72
Сеульское метро: инструкция по применению. «Остерегайтесь колясок и пожилых людей»

Сеульское метро: инструкция по применению. «Остерегайтесь колясок и пожилых людей»

Корейское метро полностью автоматизировано: здесь пользуются карточками TMoney, баланс на которых можно постоянно пополнять. Этими же картами можно расплачиваться в магазинах и столовых.
daminaishappy
18 сент. 2017 / 21:56
  • 1724
  • 4
Дагестанские «миротворцы» борются за справедливость в Мьянме на улицах Москвы

Дагестанские «миротворцы» борются за справедливость в Мьянме на улицах Москвы

Парней начали осуждать за поступок в социальных сетях. Популярные группы Кавказа назвали выходку парней дикой, и пояснили, что они позорят нацию и религию.
tala03
20 сент. 2017 / 16:42
  • 1626
  • 41
Заметка №16. «Burger shop». Съесть и не обляпаться практически невозможно

Заметка №16. «Burger shop». Съесть и не обляпаться практически невозможно

Если честно, для нас формат заведения был в диковинку - раньше нам доводилось есть бургеры в сетевых ресторанах фаст-фуда или же в заведениях, где кроме бургеров подают еще много разных блюд.
zhanuska_checkedboe
19 сент. 2017 / 15:12
  • 1410
  • 16
Как КНДР «уничтожила» американские самолеты и авианосец

Как КНДР «уничтожила» американские самолеты и авианосец

Серию коллажей, показывающую как ракеты КНДР нанесли поражения американским самолетам, продемонстрировали в северокорейских СМИ.
tala03
вчера / 17:58
  • 1141
  • 6