• 56062
  • 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
11066

Загрузка...

Комментарии

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

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

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

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

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

Только на 10-й раз он смог поступить в Кембридж! Герой с Кармакшинского района

Только на 10-й раз он смог поступить в Кембридж! Герой с Кармакшинского района

Свыше 10 известных университетов приглашают его обучаться зарубежом, но выбор будет оставаться за Сакеном. Он выберет обучение The University of Edinburgh и отправляется в эту удивительную страну...
socium_kzo
30 нояб. 2016 / 11:06
  • 10238
  • 9
Взгляд со стороны: Назарбаев глазами кыргыза

Взгляд со стороны: Назарбаев глазами кыргыза

В чем уникальность этой личности? В чем его успех или провалы? Эти вопросы требуют глубокой аналитики и исследований. Я же хочу рассказать о Нурсултане Абишевиче глазами рядового кыргыза или...
maxes
1 дек. 2016 / 8:05
  • 3730
  • 13
Молчание врачей. Дети ЮКО, заражённые ВИЧ 10-11 лет назад, узнают о диагнозе-приговоре

Молчание врачей. Дети ЮКО, заражённые ВИЧ 10-11 лет назад, узнают о диагнозе-приговоре

Как сообщают новостные издания, в ближайшее время в Южном Казахстане 102 детям в возрасте 11-12 лет сообщат об их страшном диагнозе. Все эти дети были заражены ВИЧ, причём большинство было инфицировано по вине врачей.
openqazaqstan
вчера / 13:57
  • 2911
  • 3
Когда на тебя смотрят как на говно. На работе многие считали, что они выше меня уровнем

Когда на тебя смотрят как на говно. На работе многие считали, что они выше меня уровнем

Дело было летом 2012 года. Мне было почти 20 лет, жил я от сессии до сессии довольно весело. В голове машины, клубы, тёлки. Жизнь размеренная и неторопливая. Вдруг мне приходит в голову идея...
almatinec_92
28 нояб. 2016 / 16:57
О переименовании столицы: Казнет не зря взорвался едкими комментариями

О переименовании столицы: Казнет не зря взорвался едкими комментариями

Сеть облетело очень символичное видео, где г-ну Султанову в ходе пресс-конференции прямо задают этот вопрос. «Вы советовались с народом?!» – спрашивают его журналисты. На что депутат так и не смог вразумительно ответить.
openqazaqstan
28 нояб. 2016 / 14:35
  • 3282
  • 15
Мой личный опыт использования Astra Plat: мелочи в моем кармане заметно стало меньше

Мой личный опыт использования Astra Plat: мелочи в моем кармане заметно стало меньше

Давно ждал запуска электронного билетирования в общественном транспорте Астаны. В ноябре 2016 года этот день настал. Мой опыт насчитывает последние 2 недели и мне есть чем поделиться. Она не...
iamYerlan
1 дек. 2016 / 15:24
  • 2724
  • 11
Аэропорт Схипхол и Алматы. Смотришь на это и ощущение, что мы лет на тридцать отстали

Аэропорт Схипхол и Алматы. Смотришь на это и ощущение, что мы лет на тридцать отстали

Недавно пролетал через аэропорт Амстердама - Схипхол. Так как улетал из аэропорта Алматы, то не мог не начать сравнивать эти аэропорты.
Superkurt
30 нояб. 2016 / 10:09
  • 2858
  • 12
Почему Дональд Трамп назвал Казахстан чудом. Президент подтягивается по географии

Почему Дональд Трамп назвал Казахстан чудом. Президент подтягивается по географии

Трамп и не подозревает, что 16 декабря 1991 Казахстан не создал, а восстановил свою национальную государственность. Иначе бы он упомянул не только 25 лет, а больше чем 550 лет казахской истории.
Stehlikova
вчера / 9:02
  • 2917
  • 86
Понять и простить: почему большинство стран бывшего СССР отказалось от амнистий

Понять и простить: почему большинство стран бывшего СССР отказалось от амнистий

Президент Назарбаев предложил амнистию для совершивших преступления небольшой тяжести несовершеннолетних, пожилых, женщин и других социально уязвимых категорий осуждённых
openqazaqstan
30 нояб. 2016 / 13:45
  • 2670
  • 19