W3docs

Расширенные фильтры PHP: полное руководство

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

Фильтрация входных данных — одна из важнейших привычек безопасности в PHP: любое значение, поступающее извне вашего кода — поля форм, строки запроса, куки, данные API — должно считаться ненадёжным, пока оно не прошло проверку или очистку. PHP поставляется со встроенным расширением filter, которое делает именно это, поэтому вам редко придётся вручную писать регулярные выражения для стандартных проверок. В этой главе мы выходим за рамки основ и рассматриваем флаги фильтров, коллбэки, пакетную фильтрацию, значения по умолчанию и типичные ошибки, с которыми сталкиваются в продакшне.

Если вы только знакомитесь с расширением filter, начните с вводной главы PHP Filters, а затем возвращайтесь сюда.

Понимание фильтров PHP

Фильтр — это именованное правило, которое PHP применяет к значению через функцию filter_var() (и родственные ей функции). Фильтр может выполнять одну из двух задач:

  • Валидация — проверяет, соответствует ли значение уже некоторому формату, и возвращает значение при успехе или false при неудаче. Значение не изменяется.
  • Санитизацияпреобразует значение, убирая или кодируя нежелательные символы, и возвращает очищенную строку.

Важно понимать, какая задача вам нужна: валидация отклоняет некорректные данные, санитизация их перезаписывает. Для пользовательских форм обычно сначала проводят валидацию (отклонение), а санитизацию применяют только тогда, когда нужно принять и очистить значение (например, экранировать HTML перед отображением).

Типы фильтров

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

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

Небольшое количество фильтров покрывает подавляющее большинство реальных задач:

ФильтрЗадачаПример использования
FILTER_VALIDATE_EMAILВалидацияПроверка адреса электронной почты
FILTER_VALIDATE_INTВалидацияПроверка целого числа, опционально в диапазоне
FILTER_VALIDATE_FLOATВалидацияПроверка числа с плавающей точкой
FILTER_VALIDATE_URLВалидацияПроверка URL
FILTER_VALIDATE_IPВалидацияПроверка IPv4/IPv6-адреса
FILTER_SANITIZE_FULL_SPECIAL_CHARSСанитизацияКодирование специальных символов HTML
FILTER_SANITIZE_NUMBER_INTСанитизацияУдаление всего, кроме цифр и +/-
FILTER_SANITIZE_EMAILСанитизацияУдаление символов, недопустимых в email

Вы можете вывести все фильтры, поддерживаемые вашей сборкой, с помощью filter_list().

Использование фильтров PHP

Базовый синтаксис применения фильтра:

Синтаксис функции filter_var в PHP

filter_var($variable, $filter, $options);

Где $variable — значение, которое нужно отфильтровать, $filter — константа фильтра, например FILTER_VALIDATE_EMAIL, а необязательный аргумент $options содержит флаги или параметры конкретного фильтра.

filter_var($variable, FILTER_VALIDATE_EMAIL);

Здесь filter_var() проверяет, является ли значение, хранящееся в $variable, корректным адресом электронной почты, возвращая email при успехе или false при неудаче.

Также существуют специальные функции для непосредственного чтения внешних данных — filter_input() для одного значения и filter_input_array() для нескольких — которые читают из INPUT_GET, INPUT_POST, INPUT_COOKIE и т.д. Используйте их вместо прямого обращения к $_GET/$_POST, поскольку они читают из исходных данных запроса, даже если суперглобальная переменная была изменена.

Расширенные параметры фильтров PHP

Фильтры PHP также имеют несколько расширенных параметров для настройки их поведения. Вот наиболее часто используемые из них:

  • Параметры-флаги: изменяют поведение фильтра, например требуют определённый тип данных или допускают несколько значений. Например, FILTER_FLAG_EMAIL_UNICODE разрешает международные символы при валидации email.
  • Коллбэк-функции: позволяют передать пользовательскую функцию в FILTER_CALLBACK для реализации нестандартной логики валидации или санитизации.
  • Фильтрация массивов: используйте filter_var_array() или filter_input_array() для одновременного применения фильтров к нескольким переменным — особенно удобно при обработке данных форм или строк запроса.

Примеры фильтров PHP

Вот несколько примеров использования фильтров PHP в реальных ситуациях:

Валидация email с помощью filter_var в PHP

php— editable, runs on the server

В этом примере функция filter_var используется для валидации адреса электронной почты. Если адрес корректен, скрипт выведет "Email is valid", иначе — "Email is not valid".

Санитизация строки с помощью filter_var в PHP

php— editable, runs on the server

В этом примере функция filter_var используется для санитизации строки. Фильтр FILTER_SANITIZE_FULL_SPECIAL_CHARS удаляет или кодирует HTML-теги и специальные символы, в результате чего получается безопасная и чистая строка, пригодная для использования в приложении.

Расширенные примеры фильтров PHP

Чтобы в полной мере использовать возможности фильтров PHP, вы можете применять коллбэки и фильтрацию массивов:

Фильтр PHP с коллбэком

<?php

function custom_sanitize($str) {
    return strtoupper(trim($str));
}

$input = "  hello world  ";
$result = filter_var($input, FILTER_CALLBACK, ["options" => "custom_sanitize"]);

echo $result; // Outputs: HELLO WORLD
?>

Фильтрация массива переменных в PHP

<?php

$data = [
    "email" => "[email protected]",
    "age" => "25",
    "url" => "https://example.com"
];

$filters = [
    "email" => FILTER_VALIDATE_EMAIL,
    "age" => ["filter" => FILTER_VALIDATE_INT, "options" => ["min_range" => 1, "max_range" => 120]],
    "url" => FILTER_VALIDATE_URL
];

$result = filter_var_array($data, $filters);

print_r($result);
?>

Это выведет:

Array
(
    [email] => [email protected]
    [age] => 25
    [url] => https://example.com
)

Если любое значение не проходит фильтр, соответствующий ключ будет содержать false вместо значения, что позволяет точно определить, какое поле некорректно.

Валидация целого числа в диапазоне

Параметры min_range и max_range заставляют FILTER_VALIDATE_INT отклонять числа вне допустимого диапазона — удобно для таких значений, как количество или возраст:

<?php

$age = "150";
$options = ["options" => ["min_range" => 1, "max_range" => 120]];

var_dump(filter_var($age, FILTER_VALIDATE_INT, $options)); // bool(false)
?>

Поскольку 150 превышает max_range, фильтр возвращает false, хотя "150" является вполне корректной целочисленной строкой.

Значение по умолчанию при неудачной валидации

Большинство фильтров валидации поддерживают параметр default, поэтому вы можете использовать безопасное значение вместо false:

<?php

$price = filter_var("not-a-number", FILTER_VALIDATE_FLOAT, [
    "options" => ["default" => 0.0]
]);

var_dump($price); // float(0)
?>

Типичные ошибки

Несколько особенностей, которые удивляют новичков:

  • false — допустимое значение. Когда значение равно 0 или "0", наивная проверка if (filter_var(...)) расценивает это как неудачу. Сравнивайте с false явно с помощью строгого оператора: if (filter_var($n, FILTER_VALIDATE_INT) === false).
  • Валидация не изменяет значение. FILTER_VALIDATE_* возвращает исходное значение (с приведением типа, где необходимо) или false; санитизация не выполняется. Если нужна очищенная строка, используйте фильтр FILTER_SANITIZE_*.
  • Валидация email не означает проверку доставки. FILTER_VALIDATE_EMAIL проверяет только синтаксис — он не может подтвердить существование почтового ящика. Добавьте FILTER_FLAG_EMAIL_UNICODE, если принимаете интернационализированные адреса.
  • Санитизация — это не экранирование для SQL. Для запросов к базе данных используйте подготовленные выражения (или mysqli_real_escape_string()); фильтры предназначены для очистки формата, а не для безопасности запросов.

Заключение

Подводя итог, фильтры PHP — это незаменимый инструмент для веб-разработчиков, которым нужно проверять и очищать входные данные. Благодаря разнообразию доступных типов и параметров вы можете легко адаптировать фильтры под конкретные нужды вашего приложения. Независимо от того, нужна ли вам валидация email, удаление вредоносных символов или пользовательская проверка, фильтры PHP справятся с этой задачей.

Не забывайте сочетать фильтры с другими мерами безопасности — подготовленными выражениями, экранированием вывода и защитой от CSRF — чтобы сделать ваше веб-приложение максимально защищённым. Подробное руководство см. в разделе PHP Form Validation.

Практика

Практика
Какие из следующих фильтров используются в PHP?
Какие из следующих фильтров используются в PHP?
Was this page helpful?