PHP Фильтры


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


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

Фильтры PHP используются для проверки и фильтрации данных из небезопасных источников.

Тестирование, проверка и фильтрация пользовательского ввода или пользовательских данных — важная часть любого веб-приложения.

Расширение фильтров 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" для фильтрации переменной. Поскольку целое число допустимо, приведенный выше код выведет:

Если мы попробуем использовать переменную, не являющуюся целым числом (например, "123abc"), будет выведено: "Целое число недействительно".

Полный список функций и фильтров смотрите в нашемСправочном руководстве по фильтрам PHP。


Проверка и очистка

Существует два типа фильтров:

Фильтры проверки:

  • Используются для проверки пользовательского ввода
  • Строгие правила формата (такие как проверка 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" не входит в указанный диапазон, вывод приведённого выше кода будет таким:

Not a valid integer

Полный список функций и фильтров можно найти в нашемСправочном руководстве по фильтрам PHPЗдесь можно увидеть доступные параметры и флаги для каждого фильтра.


Проверка ввода

Давайте попробуем проверить ввод из формы.

Первое, что нам нужно сделать, — убедиться, существуют ли входные данные, которые мы ищем.

Затем мы фильтруем входные данные с помощью функции filter_input().

В приведённом ниже примере входная переменная "email" передаётся на страницу PHP:

Пример

<?php if(!filter_has_var(INPUT_GET, "email")) { echo("Нет параметра email"); } else { if (!filter_input(INPUT_GET, "email", FILTER_VALIDATE_EMAIL)) { echo "Недействительный адрес электронной почты"; } else { echo "Является действительным адресом электронной почты"; } } ?>

Результат тестирования приведенного выше примера выглядит следующим образом:

Пояснение примера

В приведенном выше примере есть входная переменная (email), переданная методом "GET":

  1. Проверьте, существует ли входная переменная "email" типа "GET"
  2. Если входная переменная существует, проверьте, является ли она действительным адресом электронной почты

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

Давайте попробуем очистить URL, отправленный из формы.

Сначала нам нужно убедиться, существуют ли входные данные, которые мы ищем.

Затем мы используем функцию filter_input() для очистки входных данных.

В приведенном ниже примере входная переменная "url" передается на страницу PHP:

<?php
if(!filter_has_var(INPUT_GET, "url"))
{
    echo("没有 url 参数");
}
else
{
    $url = filter_input(INPUT_GET, 
    "url", FILTER_SANITIZE_URL);
    echo $url;
}
?>

Пояснение примера

В приведенном выше примере входная переменная (url) отправляется методом "GET":

  1. Проверить, существует ли входная переменная "url" типа "GET"
  2. Если эта входная переменная существует, очистите ее (удалите недопустимые символы) и сохраните в переменной $url

Если входная переменная является строкой такого вида: "http://www.ruåånoøøob.com/", то очищенная переменная $url будет выглядеть так:



Фильтрация нескольких входных данных

Формы обычно состоят из нескольких полей ввода. Чтобы избежать повторных вызовов функций 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("Возраст должен быть от 1 до 120.<br>"); } elseif(!$result["email"]) { echo("Электронная почта недействительна<br>"); } else { echo("Ввод корректен"); } ?>

Пояснение примера

В приведённом выше примере есть три входные переменные (name, age и email), отправленные методом "GET":

  1. Создайте массив, содержащий имена входных переменных и фильтры, используемые для указанных входных переменных
  2. Вызовите функцию filter_input_array() с входными переменными GET и только что созданным массивом в качестве параметров
  3. Проверьте, содержат ли переменные "age" и "email" в переменной $result недопустимый ввод. (Если недопустимый ввод существует, входные переменные становятся FALSE после использования функции filter_input_array().)

Второй параметр функции filter_input_array() может быть массивом или идентификатором одного фильтра.

Если параметр — это ID одного фильтра, то указанный фильтр фильтрует все значения во входном массиве.

Если параметр — массив, то этот массив должен соответствовать правилам ниже:

  • Это должен быть ассоциативный массив, в котором содержащиеся в нём входные переменные являются ключами массива (например, входная переменная "age")
  • Значения этого массива должны быть ID фильтров или массивом, который задаёт фильтры, флаги и опции.

Использование обратного вызова фильтра

Используя фильтр FILTER_CALLBACK, можно вызвать пользовательскую функцию и использовать её как фильтр. Это даёт полный контроль над фильтрацией данных.

Вы можете создавать собственные пользовательские функции или использовать существующие функции PHP.

Укажите функцию, которую вы собираетесь использовать в качестве фильтра, способом, указанным в опциях. В ассоциативном массиве используйте имя "options".

В примере ниже мы используем пользовательскую функцию, чтобы преобразовать все "_" в ".":

Пример

<?php function convertSpace($string) { return str_replace("_", ".", $string); } $string = "www_example_com!"; echo filter_var($string, FILTER_CALLBACK, array("options"=>"convertSpace")); ?>

Результат приведённого выше кода показан ниже:

Пояснение примера

Приведённый выше пример преобразует все "_" в ".":

  1. Создайте функцию, которая заменяет "_" на "."
  2. Вызовите функцию filter_var() с фильтром FILTER_CALLBACK и массивом, содержащим нашу функцию
Другие расширения