
Фильтрация данных в PHP – критически важная задача при работе с пользовательским вводом, особенно при взаимодействии с формами, API и базами данных. Неправильная или отсутствующая фильтрация может привести к XSS, SQL-инъекциям и другим уязвимостям. В этой статье рассматриваются практические подходы к созданию фильтров с использованием встроенных функций PHP без сторонних библиотек.
Для начала важно понимать различие между фильтрацией и валидацией. Фильтрация – это преобразование данных к безопасному или нужному формату. Например, удаление HTML-тегов из строки или приведение email-адреса к нижнему регистру. В PHP для этого применяется функция filter_var() с различными фильтрами, такими как FILTER_SANITIZE_STRING, FILTER_SANITIZE_EMAIL, FILTER_SANITIZE_NUMBER_INT.
Рассмотрим ситуацию: пользователь отправляет форму с полями «Имя», «Возраст», «Email». Простой фильтр можно реализовать через массив с фильтрами, переданный в filter_input_array(). Такой подход позволяет централизованно и последовательно фильтровать весь входящий массив $_POST, минимизируя вероятность упущений.
Дополнительно имеет смысл создавать собственные функции фильтрации, особенно когда требуется логика, выходящая за рамки стандартных фильтров. Например, удаление лишних пробелов, приведение строк к Unicode NFC или фильтрация emoji. Такие функции можно инкапсулировать в отдельный класс, что делает код более управляемым и пригодным для тестирования.
Фильтрация пользовательского ввода через функцию filter_input()

Функция filter_input() используется для получения и фильтрации данных из суперглобальных массивов $_GET, $_POST, $_COOKIE, $_SERVER и $_ENV. Она минимизирует риск XSS и других уязвимостей, так как обрабатывает ввод до использования в коде.
Сигнатура функции: filter_input(int $type, string $variable_name, int $filter = FILTER_DEFAULT, array|int $options = 0). Первый параметр – источник данных, например INPUT_POST. Второй – имя переменной. Третий – тип фильтра, например FILTER_VALIDATE_INT или FILTER_SANITIZE_EMAIL. Четвёртый – массив опций или флаг.
Пример: фильтрация ID из POST-запроса с проверкой, что это целое число.
$user_id = filter_input(INPUT_POST, 'user_id', FILTER_VALIDATE_INT);
if ($user_id === false) {
// Ошибка валидации: значение не является целым числом
}
Для строк используется фильтр FILTER_SANITIZE_STRING (устаревший с PHP 8.1, не рекомендуется). Лучше применять FILTER_UNSAFE_RAW с флагом FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH:
$username = filter_input(INPUT_POST, 'username', FILTER_UNSAFE_RAW, [
'flags' => FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH
]);
Фильтрация email-адреса с валидацией:
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
if ($email === false) {
// Недопустимый email
}
Для массивов используется ключ options с вложенными фильтрами:
$filters = [
'age' => ['filter' => FILTER_VALIDATE_INT, 'options' => ['min_range' => 18, 'max_range' => 99]],
'email' => FILTER_VALIDATE_EMAIL
];
$result = filter_input_array(INPUT_POST, $filters);
Использование filter_input() предпочтительнее прямого обращения к $_POST или $_GET, так как обеспечивает централизованную обработку и защиту входных данных.
Использование filter_var() для проверки и преобразования данных
Функция filter_var() позволяет валидировать и фильтровать данные с минимальным количеством кода. Она принимает значение, тип фильтра и необязательные параметры. Это особенно полезно при работе с пользовательским вводом.
Проверка email:
$email = 'example@mail.com';
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
// Корректный email
} else {
// Неверный формат
}
Валидация URL с обязательным протоколом:
$url = 'https://example.com';
if (filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED)) {
// Валидный URL с путем
}
Фильтрация чисел:
$int = '42';
$cleanInt = filter_var($int, FILTER_VALIDATE_INT);
if ($cleanInt !== false) {
// Целое число
}
Ограничение диапазона чисел:
$age = 25;
$options = ['options' => ['min_range' => 18, 'max_range' => 99]];
if (filter_var($age, FILTER_VALIDATE_INT, $options)) {
// Возраст в допустимом диапазоне
}
Удаление нежелательных символов из строки:
$dirty = '<script>alert(1)</script>';
$clean = filter_var($dirty, FILTER_SANITIZE_STRING);
// $clean = 'alert(1)'
Фильтрация IP-адреса:
$ip = '192.168.0.1';
if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
// Корректный IPv4
}
filter_var() особенно полезна в связке с массивами данных и формами. Она позволяет избежать ручной обработки ввода, повышая безопасность и сокращая код.
Создание пользовательской функции фильтрации с регулярными выражениями
Для фильтрации данных на основе конкретных шаблонов удобно использовать регулярные выражения. Ниже приведён пример функции, которая принимает строку и паттерн, и возвращает либо отфильтрованное значение, либо null, если проверка не пройдена.
function regexFilter(string $input, string $pattern): ?string {
return preg_match($pattern, $input) ? $input : null;
}
Пример использования: фильтрация email-адресов. Используем паттерн для проверки корректности структуры email:
$email = "example@domain.com";
$filteredEmail = regexFilter($email, '/^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$/i');
if ($filteredEmail !== null) {
echo "Допустимый email: $filteredEmail";
} else {
echo "Неверный формат email";
}
Другой пример – фильтрация телефонных номеров в формате +7 (XXX) XXX-XX-XX:
$phone = "+7 (999) 123-45-67";
$filteredPhone = regexFilter($phone, '/^\+7\s\(\d{3}\)\s\d{3}-\d{2}-\d{2}$/');
if ($filteredPhone !== null) {
echo "Корректный номер: $filteredPhone";
} else {
echo "Неверный формат номера";
}
Регулярные выражения позволяют точно контролировать входные данные. Необходимо учитывать экранирование символов и чувствительность к регистру. Для повышения надёжности предпочтительно использовать строго определённые шаблоны, исключающие невалидные вводы на раннем этапе.
Фильтрация массивов с помощью array_filter() и пользовательской логики
Функция array_filter() позволяет отфильтровать массив по заданному критерию, определённому в пользовательской функции обратного вызова. Если колбэк не задан, будут удалены элементы со значением false, null, 0, пустые строки и другие «пустые» значения.
Пример: фильтрация массива чисел, оставляя только чётные значения:
$numbers = [1, 2, 3, 4, 5, 6];
$even = array_filter($numbers, fn($n) => $n % 2 === 0);
// Результат: [1 => 2, 3 => 4, 5 => 6]
Для сохранения новых ключей используйте array_values():
$even = array_values($even);
// Результат: [2, 4, 6]
Фильтрация ассоциативного массива возможна с передачей второго аргумента ARRAY_FILTER_USE_BOTH или ARRAY_FILTER_USE_KEY:
$users = [
'admin' => ['role' => 'admin'],
'guest' => ['role' => 'guest'],
'editor' => ['role' => 'editor']
];
$admins = array_filter($users, fn($user) => $user['role'] === 'admin');
// Результат: ['admin' => ['role' => 'admin']]
Для фильтрации по ключам:
$filtered = array_filter($users, fn($key) => $key !== 'guest', ARRAY_FILTER_USE_KEY);
// Исключён пользователь 'guest'
Можно комбинировать условия:
$result = array_filter(
$users,
fn($user, $key) => $user['role'] !== 'guest' && $key !== 'editor',
ARRAY_FILTER_USE_BOTH
);
// Оставит только 'admin'
Для сложных структур массивов рекомендуется выносить логику фильтрации в именованную функцию:
function isActiveUser($user) {
return isset($user['active']) && $user['active'] === true;
}
$activeUsers = array_filter($usersList, 'isActiveUser');
Использование array_filter() в сочетании с лямбда-функциями или внешней логикой позволяет гибко управлять фильтрацией данных в любых сценариях.
Удаление HTML-тегов и скриптов с помощью strip_tags() и htmlspecialchars()
Функция strip_tags() удаляет HTML и PHP-теги из строки. Она полезна при фильтрации данных, поступающих из формы, чтобы исключить потенциально опасный HTML-код.
Пример удаления всех тегов:
$input = '<script>alert("XSS")</script><b>Текст</b>';
$clean = strip_tags($input);
Чтобы сохранить некоторые теги, укажите их вторым параметром:
$input = '<p>Параграф</p><b>Жирный текст</b>';
$clean = strip_tags($input, '<p>');
Функция htmlspecialchars() преобразует специальные символы в HTML-сущности. Это предотвращает исполнение кода браузером.
$input = '<script>alert("XSS")</script>';
$safe = htmlspecialchars($input, ENT_QUOTES, 'UTF-8');
Рекомендуется комбинировать обе функции при обработке пользовательского ввода:
$input = $_POST['comment'];
$clean = strip_tags($input);
$safe = htmlspecialchars($clean, ENT_QUOTES, 'UTF-8');
Сравнение возможностей функций:
| Функция | Назначение | Тип фильтрации |
|---|---|---|
| strip_tags() | Удаляет HTML и PHP-теги | Структурная фильтрация |
| htmlspecialchars() | Преобразует символы в HTML-сущности | Символьная фильтрация |
Не используйте эти функции для обработки HTML, предназначенного для отображения – они предназначены только для защиты от внедрения нежелательного кода.
Проверка числовых значений и диапазонов с помощью встроенных фильтров
В PHP встроены фильтры, которые позволяют легко проверять числовые значения и диапазоны. Для таких задач можно использовать функцию filter_var()>, которая предоставляет удобные механизмы для валидации и фильтрации данных.
Для проверки, является ли значение числом, можно использовать фильтр FILTER_VALIDATE_INT. Этот фильтр проверяет, что строка содержит целое число. Например:
$number = "123";
if (filter_var($number, FILTER_VALIDATE_INT)) {
echo "Число верное";
} else {
echo "Неверное число";
}
Однако, если требуется уточнить диапазон чисел, например, проверить, что число находится в пределах от 1 до 100, нужно воспользоваться дополнительными параметрами для указания минимального и максимального значений с помощью options.
$options = array(
"options" => array(
"min_range" => 1,
"max_range" => 100
)
);
$number = 50;
if (filter_var($number, FILTER_VALIDATE_INT, $options)) {
echo "Число в пределах диапазона";
} else {
echo "Число вне диапазона";
}
Для проверки чисел с плавающей запятой можно использовать фильтр FILTER_VALIDATE_FLOAT. Он работает аналогично FILTER_VALIDATE_INT, но проверяет значения с десятичными точками. Пример:
$floatNumber = "123.45";
if (filter_var($floatNumber, FILTER_VALIDATE_FLOAT)) {
echo "Число с плавающей запятой верное";
} else {
echo "Неверное число с плавающей запятой";
}
Если нужно проверить значение на наличие отрицательных чисел, достаточно указать соответствующие параметры. Важно помнить, что фильтры PHP проверяют не только корректность значения, но и его тип, что предотвращает неправильное преобразование данных.
Также стоит помнить, что при работе с фильтрами следует учитывать пограничные условия. Например, если проверка чисел с плавающей запятой не требует строгой точности, можно использовать дополнительные фильтры для округления или преобразования данных в нужный формат, избегая ошибок при дальнейшей обработке.
Очистка URL и электронной почты с filter_var() и соответствующими фильтрами
Функция filter_var() в PHP позволяет легко и безопасно обрабатывать данные, например, очищать URL и электронные почтовые адреса. Она использует различные фильтры для проверки и фильтрации данных, что делает её полезной для предотвращения ошибок и уязвимостей в приложениях. Рассмотрим, как использовать фильтры для очистки URL и электронной почты.
Основные фильтры для работы с URL и почтой:
FILTER_VALIDATE_URL– проверяет, является ли строка допустимым URL.FILTER_VALIDATE_EMAIL– проверяет, является ли строка валидным электронным адресом.
Примеры использования:
Очистка URL

Для проверки, является ли строка корректным URL, используется фильтр FILTER_VALIDATE_URL. Важно помнить, что этот фильтр не проверяет, доступен ли сайт, а только проверяет формат строки.
$url = "https://example.com";
if (filter_var($url, FILTER_VALIDATE_URL)) {
echo "URL валиден!";
} else {
echo "Некорректный URL!";
}
При необходимости можно дополнительно использовать фильтр FILTER_SANITIZE_URL, который очищает строку от нежелательных символов, оставляя только допустимые для URL.
$dirty_url = "https://example.com/";
$clean_url = filter_var($dirty_url, FILTER_SANITIZE_URL);
echo $clean_url; // Выведет: https://example.com/
Очистка электронной почты
Для проверки электронной почты используется фильтр FILTER_VALIDATE_EMAIL, который проверяет, соответствует ли строка формату email-адреса.
$email = "user@example.com";
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo "Электронная почта валидна!";
} else {
echo "Некорректный email!";
}
Если вы хотите удалить из электронной почты нежелательные символы (например, пробелы или специальные символы), можно применить фильтр FILTER_SANITIZE_EMAIL.
$dirty_email = "user @example.com";
$clean_email = filter_var($dirty_email, FILTER_SANITIZE_EMAIL);
echo $clean_email; // Выведет: user@example.com
Рекомендации

- Используйте
FILTER_VALIDATE_URLиFILTER_VALIDATE_EMAILдля проверки, а не для очистки данных. Это поможет избежать ошибок в логике приложения. - Применяйте
FILTER_SANITIZE_URLиFILTER_SANITIZE_EMAILтолько в случае необходимости очистки входных данных от нежелательных символов. - Не полагайтесь на фильтры для обеспечения полной безопасности, всегда дополнительно обрабатывайте данные в зависимости от контекста.
- При работе с URL проверяйте протокол (например,
http://илиhttps://) для повышения безопасности.
Интеграция фильтрации в форму обратной связи с обработкой POST-запроса

Основной задачей фильтрации является предотвращение ввода нежелательных или опасных данных, таких как XSS-атаки, SQL-инъекции, а также проверка на корректность формата данных (например, email, номер телефона). Рассмотрим реализацию такой фильтрации на примере формы обратной связи.
1. Создание формы обратной связи
Начнем с создания простой формы с полями для имени, email и сообщения:
2. Обработка POST-запроса и фильтрация данных
После того как форма будет отправлена, данные поступят на сервер, где они должны быть проверены и обработаны. Рассмотрим пример обработки данных в файле process.php:
3. Описание процесса фильтрации
- Тримминг данных: Перед фильтрацией данные обрабатываются функцией
trim(), чтобы удалить лишние пробелы по краям строк. - HTML-сущности: Для защиты от XSS-атак используется
htmlspecialchars(), которая заменяет специальные символы на HTML-сущности. - Валидация email: Для проверки формата email используется фильтр
FILTER_VALIDATE_EMAIL. Это гарантирует, что введенный email соответствует стандарту. - Проверка на пустые поля: Перед обработкой данных всегда проверяется, не являются ли поля пустыми. Это предотвращает отправку некорректных данных.
4. Дополнительные рекомендации

- Защита от CSRF: Используйте защиту от подделки запросов с помощью токенов. Это помогает предотвратить атаки, направленные на выполнение нежелательных действий от имени пользователя.
- Использование регулярных выражений: Для более сложной валидации (например
Вопрос-ответ:
Что такое фильтр в PHP и для чего он используется?
Фильтр в PHP представляет собой механизм, который позволяет обрабатывать данные, поступающие от пользователя, и проверять их на соответствие определённым правилам. Основное назначение фильтра — это защита от нежелательных данных, например, XSS-атак или SQL-инъекций. Примером может служить фильтрация email-адреса, чтобы убедиться, что введённый текст соответствует формату email-адреса.
Как применить фильтр для проверки email в PHP? Приведите пример кода.
Для проверки email-адреса в PHP можно использовать функцию `filter_var()` с флагом `FILTER_VALIDATE_EMAIL`. Этот фильтр проверяет, является ли строка корректным email-адресом. Пример кода:
Можно ли создать свой собственный фильтр в PHP для проверки пользовательских данных?
Да, в PHP можно создать собственные фильтры, для этого используется функция `filter_var()` в сочетании с пользовательскими функциями или регулярными выражениями. Например, для проверки строки на соответствие специфическому формату можно использовать регулярное выражение. Вот пример:
Как использовать фильтры для предотвращения SQL-инъекций в PHP?
Для защиты от SQL-инъекций важно фильтровать данные, поступающие от пользователя. Хотя фильтры могут помочь в базовой проверке данных, лучшим методом защиты является использование подготовленных запросов (prepared statements) в связке с PDO или MySQLi. Например:
Какие ещё фильтры предоставляет PHP для работы с данными?
PHP предоставляет множество встроенных фильтров для различных типов данных. Например:
