Безопасное получение данных из GET-запроса: функция get() в PHP
Обзор функции get() в PHP: безопасное извлечение данных из GET-запроса
Наиболее эффективное решение для безопасного получения значения параметра запроса - использование собственной функции get(), которая объединяет проверку существования ключа, фильтрацию и установку значения по умолчанию. Этот подход устраняет необходимость каждый раз писать сложные конструкции и уменьшает риск ошибок.
function get(string $key, $default = null, int $filter = FILTER_DEFAULT, array $options = []) {
if (isset($_GET[$key])) {
return filter_var($_GET[$key], $filter, $options);
}
return $default;
}
функции работы с массивом php (функции для работы с массивами в php)
Пример использования:
$name = get('name', 'гость', FILTER_SANITIZE_STRING);
echo $name;
функция file php (функция file() в php)
Результат при GET-запросе ?name=Иван:
Иван
функция get php (функция get() в php)
Проблема: если не использовать фильтрацию, злоумышленник может внедрить вредоносный код через GET-параметр. Решение: передавать фильтр, например FILTER_SANITIZE_STRING или FILTER_VALIDATE_INT.
Далее рассмотрены альтернативные подходы с их целями и ограничениями.
Как получить значение из $_GET напрямую?
Самый простой способ - обратиться к суперглобальному массиву $_GET:
$page = $_GET['page'];
функция php выводит данные на экран (вывод данных на экран в php)
Ошибка: если ключ page отсутствует, PHP выдаст предупреждение Undefined array key. Решение: использовать isset() или оператор объединения с null (??).
Как избежать ошибки при отсутствии параметра с помощью isset()?
if (isset($_GET['page'])) {
$page = $_GET['page'];
} else {
$page = 1;
}
статическая функция php (статические методы в php)
Неудобство: для каждого параметра приходится писать три строки кода. Это загромождает скрипт и увеличивает вероятность опечаток.
Какие преимущества даёт оператор объединения с null (??)?
Начиная с PHP 7.0, можно использовать ?? для установки значения по умолчанию:
$page = $_GET['page'] ?? 1;
Php функции даты (функции даты в php)
Значение 1 будет использовано, если параметр page не передан или равен null. Но это не защищает от SQL-инъекций или XSS.
Как применить filter_input для GET-параметров?
PHP предоставляет функцию filter_input(), специально предназначенную для фильтрации внешних данных:
$age = filter_input(INPUT_GET, 'age', FILTER_VALIDATE_INT);
if ($age === false) {
// некорректное значение
}
функция return php (оператор return в функциях php)
Проблема: filter_input() возвращает false при ошибке валидации, но если параметра нет, возвращается null. Нужно различать эти случаи, что усложняет код.
Как объединить фильтрацию и значение по умолчанию?
Можно комбинировать filter_input() с ??:
$limit = filter_input(INPUT_GET, 'limit', FILTER_VALIDATE_INT, ['options' => ['default' => 10]]);
передача функции php (передача функции в качестве аргумента в php)
Однако такой синтаксис не всегда интуитивно понятен. Функция get(), описанная в начале, предлагает более лаконичную запись.
Как написать собственную обёртку для GET-параметров с рекурсивным доступом?
Если GET-параметр представляет собой массив, можно создать функцию для доступа к вложенным ключам:
function get_nested(array $data, string $path, $default = null) {
$keys = explode('.', $path);
foreach ($keys as $key) {
if (!isset($data[$key])) {
return $default;
}
$data = $data[$key];
}
return $data;
}
// При запросе ?filter[name]=john
echo get_nested($_GET, 'filter.name', 'неизвестно');
Проблема: такой подход не фильтрует данные. Требуется дополнительная обработка каждого уровня.
Заключение по выбору подхода
Использование специализированной функции get() обеспечивает читаемость, безопасность и гибкость. Для простых сценариев достаточно оператора ??, но когда нужна фильтрация, лучше создать собственную обёртку.
Расширенные примеры использования функции get()
В дополнение к основной реализации, можно добавить поддержку типов, валидацию массивов и логирование ошибок.
/**
* Универсальная функция get() с поддержкой типов и вложенных ключей.
*
* @param string $key Ключ или путь через точку (например, "user.name")
* @param mixed $default Значение по умолчанию
* @param int $filter Константа FILTER_* (FILTER_VALIDATE_INT, FILTER_SANITIZE_STRING и т.д.)
* @param array $options Дополнительные опции фильтра
* @return mixed
*/
function get(string $key, $default = null, int $filter = FILTER_DEFAULT, array $options = []): mixed
{
$keys = explode('.', $key);
$data = $_GET;
foreach ($keys as $k) {
if (!array_key_exists($k, $data)) {
return $default;
}
$data = $data[$k];
}
// Если полученный элемент нескалярный (массив), возвращаем как есть, иначе фильтруем
if (is_array($data)) {
return $data;
}
return filter_var($data, $filter, $options);
}
Пример 1: получение вложенного значения и его валидация
// URL: ?filter[year]=2025&filter[month]=12
$year = get('filter.year', date('Y'), FILTER_VALIDATE_INT, ['options' => ['min_range' => 2000, 'max_range' => 2100]]);
echo "Год: $year";
Год: 2025
Пример 2: невалидное значение - вернётся значение по умолчанию
$year = get('filter.year', 2024, FILTER_VALIDATE_INT, ['options' => ['min_range' => 2000, 'max_range' => 2100]]);
// Если передано ?filter[year]=abc, то filter_var вернёт false, но isset сработает.
// Необходимо обрабатывать false в функции. Дополненная версия ниже.
Улучшенная функция с проверкой результата фильтрации
function get_safe(string $key, $default = null, int $filter = FILTER_DEFAULT, array $options = []): mixed
{
$keys = explode('.', $key);
$data = $_GET;
foreach ($keys as $k) {
if (!array_key_exists($k, $data)) {
return $default;
}
$data = $data[$k];
}
if (is_array($data)) {
return $data;
}
$filtered = filter_var($data, $filter, $options);
// Если фильтр вернул false и значение не было пустым (то есть ошибка валидации), возвращаем default
if ($filtered === false && $data !== false) {
return $default;
}
return $filtered;
}
Пример 3: работа с фильтром булевых значений
// URL: ?active=1
$active = get_safe('active', false, FILTER_VALIDATE_BOOLEAN);
var_dump($active);
bool(true)
Пример 4: использование фильтрации для целочисленного массива
// URL: ?ids[]=1&ids[]=2&ids[]=abc
$ids = get_safe('ids', [], FILTER_VALIDATE_INT, ['flags' => FILTER_REQUIRE_ARRAY]);
print_r($ids);
Array
(
[0] => 1
[1] => 2
[2] => false
)
В данном случае невалидные элементы становятся false. Чтобы отбросить их, нужно дополнительно фильтровать массив.
Пример 5: кастомный callback
function get_custom(string $key, callable $callback, $default = null)
{
$value = get_safe($key);
if ($value === $default) {
return $default;
}
return $callback($value);
}
// Использование: преобразование к нижнему регистру
$name = get_custom('name', 'strtolower', 'безымянный');
echo $name;
Эти примеры демонстрируют, как адаптировать функцию get() под различные сценарии: вложенные массивы, строгая валидация, обработка массивов и пользовательские трансформации.