Фильтры (Filter) PHP
- Предыдущая страница PHP Exception
- Следующая страница Введение в MySQL
PHP-фильтры используются для валидации и фильтрации данных из несécurных источников, таких как ввод пользователей.
Что такое PHP-фильтры?
PHP-фильтры используются для валидации и фильтрации данных из несécurных источников.
Валидация и фильтрация ввода пользователей или пользовательских данных являются важной частью любого веб-приложения.
Цель расширения фильтров PHP - сделать процесс фильтрации данных более легким и быстрым.
Почему использовать фильтры?
Почти все веб-приложения зависят от внешних входных данных. Эти данные обычно поступают от пользователей или других приложений (например, веб-сервисов). Используя фильтры, вы можете обеспечить получение приложением правильного типа входных данных.
Всегда фильтруйте внешние данные!
Фильтрация ввода является одним из важнейших вопросов безопасности приложений.
Что такое внешние данные?
- Входные данные из формы
- Cookies
- Серверные переменные
- Результаты запроса базы данных
Функции и фильтры
Для фильтрации переменных используйте одну из следующих функций фильтрации:
- filter_var() - Фильтрация одной переменной через указанный фильтр
- filter_var_array() - Фильтрация нескольких переменных через одинаковые или различные фильтры
- filter_input - Получение одной входной переменной и фильтрация её
- filter_input_array - Получение нескольких входных переменных и фильтрация их через одинаковые или различные фильтры
В следующем примере мы использовали функцию filter_var() для проверки целого числа:
<?php $int = 123; if(!filter_var($int, FILTER_VALIDATE_INT)) { echo("Целое число недействительно"); } else { echo("Целое число действителен"); } ?>
В приведенном выше коде используется фильтр "FILTER_VALIDATE_INT", чтобы фильтровать переменную. Поскольку это целое число является действительным, вывод кода: "Целое число действителен".
Если мы пытаемся использовать переменную, не являющуюся целым числом, вывод будет: "Целое число недействительно".
Для получения полного списка функций и фильтров обратитесь в наш Руководство по PHP Filter.
Проверка и стерилизация
Есть два типа фильтров:
Фильтры проверки:
- Используется для проверки ввода пользователей
- Строгие правила формата (например, проверка URL или E-Mail)
- Возвращает ожидаемый тип, если успешен, возвращает FALSE, если失败
Фильтр стерилизации:
- Используется для разрешения или запрета指定的 символов в строке
- Нет правил формата данных
- Всегда возвращает строку
Параметры и флаги
Параметры и флаги используются для добавления дополнительных параметров фильтрации к указанному фильтру.
Разные фильтры имеют различные параметры и флаги.
В следующем примере мы использовали функцию filter_var() и параметры "min_range" и "max_range", чтобы проверить целое число:
<?php $var=300; $int_options = array( "options"=>array ( "min_range"=>0, "max_range"=>256 ) ); if(!filter_var($var, FILTER_VALIDATE_INT, $int_options)) { echo("Целое число недействительно"); } else { echo("Целое число действителен"); } ?>
Как и в приведенном выше коде, параметры должны быть включены в связанный массив с именем "options". Если используются флаги, их не нужно включать в массив.
Поскольку целое число "300" не находится в указанном диапазоне, вывод кода будет "Integer is not valid".
Для полного списка функций и фильтров обратитесь к CodeW3C.com Руководство по PHP FilterВы можете увидеть доступные параметры и флаги каждого фильтра.
Проверка ввода
Давайте попробуем проверить ввод, поступивший из формы.
Первой задачей, которую нам нужно выполнить, является подтверждение наличия вводимых данных, которые мы ищем.
Затем мы используем функцию filter_input() для фильтрации вводимых данных.
В следующем примере переменная ввода "email" передается на страницу PHP:
<?php if(!filter_has_var(INPUT_GET, "email")) { echo("Тип ввода не существует"); } else { if (!filter_input(INPUT_GET, "email", FILTER_VALIDATE_EMAIL)) { echo "E-Mail is not valid"; } else { echo "E-Mail is valid"; } } ?>
Объяснение примера:
В примере выше есть переменная ввода (email), передаваемая методом "GET":
- Проверка наличия переменной ввода типа "GET" для "email"
- Если существует переменная ввода, проверьте, является ли она действительным адресом электронной почты
Очистка ввода
Давайте попробуем почистить URL, переданный из формы.
Сначала мы должны убедиться, что существует вводимые данные, которые мы ищем.
Затем мы используем функцию filter_input() для очистки вводимых данных.
В следующем примере переменная ввода "url" передается на страницу PHP:
<?php if(!filter_has_var(INPUT_POST, "url")) { echo("Тип ввода не существует"); } else { $url = filter_input(INPUT_POST, "url", FILTER_SANITIZE_URL); } ?>
Объяснение примера:
В примере выше есть переменная ввода (url), передаваемая методом "POST":
- Проверка наличия переменной ввода типа "POST" для "url"
- Если существует переменная ввода, ее необходимо очистить (удалить недопустимые символы) и сохранить в переменной $url
Если переменная ввода ähnelt so etwas: "http://www.W3非o法ol.com.c字符n/", то очищенный после этого переменная $url должна быть такой:
http://www.codew3c.com/
Фильтрация множественных вводов
Формы обычно состоят из множества вводных полей. Чтобы избежать повторного вызова filter_var или filter_input, можно использовать filter_var_array или функцию filter_input_array.
В этом примере мы используем функцию filter_input_array() для фильтрации трех GET-переменных. Полученные GET-переменные включают имя, возраст и адрес электронной почты:
<?php $filters = array ( "name" => array ( "filter"=>FILTER_SANITIZE_STRING ), "age" => array ( "filter"=>FILTER_VALIDATE_INT, "options"=>array ( "min_range"=>1, "max_range"=>120 ) ), "email"=> FILTER_VALIDATE_EMAIL, ); $result = filter_input_array(INPUT_GET, $filters); if (!$result["age"]) { echo("Age must be a number between 1 and 120.<br />"); } elseif(!$result["email"]) { echo("E-Mail is not valid.<br />"); } else { echo("User input is valid"); } ?>
Объяснение примера:
В примере есть три вводимых переменные, переданные методом "GET" (имя, возраст и адрес электронной почты)
- Установите массив, который содержит имена вводимых переменных и фильтры для указанных вводимых переменных
- Вызов функции filter_input_array с параметрами GET-ввода и только что установленных массивов
- Проверьте, содержат ли переменные "age" и "email" переменной $result незаконный ввод. (Если есть незаконный ввод,)
Вторым параметром функции filter_input_array() может быть массив или единственный ID фильтра.
Если параметр является ID единственного фильтра, то указанный фильтр будет фильтровать все значения в вводимом массиве.
Если параметр является массивом, то этот массив должен следовать следующим правилам:
- Это должен быть связный массив, содержащий входные переменные в качестве ключей массива (например, "age" в качестве входной переменной)
- Значения этого массива должны быть идентификаторами фильтров или массивами, определяющими фильтры, флаги и параметры.
Использование Filter Callback
Используя фильтр FILTER_CALLBACK, можно вызывать пользовательские функции и использовать их в качестве фильтров. Таким образом, мы получаем полную kontrolю над фильтрацией данных.
Вы можете создать свои собственные пользовательские функции или использовать уже существующие функции PHP.
Определите способ использования функции фильтра, аналогично определению параметров.
В следующем примере мы используем пользовательскую функцию для замены всех "_" на пробелы:
<?php function convertSpace($string) { return str_replace("_", " ", $string); } $string = "Peter_is_a_great_guy!"; echo filter_var($string, FILTER_CALLBACK, array("options"=>"convertSpace")); ?>
Результат кода следующий:
Peter is a great guy!
Объяснение примера:
В примере выше все "_" были заменены на пробелы:
- Создание функции, которая заменяет "_" на пробел
- Вызов функции filter_var() с параметром фильтра FILTER_CALLBACK и массивом, содержащим наши функции
- Предыдущая страница PHP Exception
- Следующая страница Введение в MySQL