Безопасное получение данных из GET-запроса: функция get() в PHP

Раздел: PHP -> Функции 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() обеспечивает читаемость, безопасность и гибкость. Для простых сценариев достаточно оператора ??, но когда нужна фильтрация, лучше создать собственную обёртку.

- Php глобальные функции (глобальные функции в php)
- Php proc open (функция proc_open в php)
- функция array php (функция array() в php)

Расширенные примеры использования функции 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() под различные сценарии: вложенные массивы, строгая валидация, обработка массивов и пользовательские трансформации.

Функция get() в PHP - comments

En
функция get php (php)