Серверные переменные PHP: методы извлечения и примеры
Основные методы получения серверных переменных
Наиболее эффективный способ: прямое обращение к суперглобальным массивам с проверкой существования.
Суперглобальные массивы $_GET, $_POST, $_SERVER, $_FILES, $_COOKIE, $_REQUEST и $_ENV содержат все данные, переданные в HTTP запросе. Для безопасного получения значения используется isset() или оператор ?? (null coalescing).
// Получение параметра name из GET
$name = $_GET['name'] ?? 'не указано';
echo $name;
Php get response (получение серверных переменных в php)
Шаги: проверка существования ключа, присвоение значения по умолчанию, вывод. Такой подход гарантирует отсутствие ошибок уровня notice при отсутствии параметра.
Типичные ошибки и их решения:
- Ошибка: обращение к несуществующему ключу без проверки вызывает warning. Решение: всегда использовать оператор
??илиisset(). - Ошибка: доверие входящим данным без санитизации. Решение: применять фильтры (
filter_var) или экранирование при выводе.
Как получить и одновременно отфильтровать параметр?
Функция filter_input(INPUT_GET, 'param', FILTER_SANITIZE_STRING) возвращает отфильтрованное значение или null/false в случае ошибки. Цель: безопасное извлечение данных с валидацией.
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
if ($email === false) {
echo 'Некорректный email';
}
Php get body (получение тела запроса)
Случаи использования: когда необходимо сразу защититься от XSS или проверить формат данных.
Проблемы:
- filter_input может вернуть
null(если ключ отсутствует) илиfalse(если фильтр не прошёл), что требует отдельной проверки. - Не подходит для сложных структур (например, массивы параметров).
Как получить JSON или XML из тела POST запроса?
Для данных в формате JSON, XML или других, передаваемых не через стандартную форму, необходимо читать сырой поток php://input. Цель: обработка REST API запросов.
// Чтение тела запроса
$rawData = file_get_contents('php://input');
$data = json_decode($rawData, true); // получаем ассоциативный массив
Случаи использования: приём JSON от JavaScript, вебхуки, микросервисы.
Ошибки:
- php://input можно прочитать только один раз (после чтения поток закрывается). При необходимости повторного доступа сохранить данные в переменную.
- При загрузке файлов через multipart/form-data поток php://input не содержит данные форм.
Как получить данные из любого источника (GET, POST, COOKIE) без указания?
Массив $_REQUEST объединяет $_GET, $_POST и $_COOKIE. Цель: универсальный доступ (не рекомендуется для безопасных приложений).
$action = $_REQUEST['action'] ?? '';
Случаи использования: простые скрипты, где источник не важен.
Недостатки:
- Невозможно определить, откуда пришло значение (GET или POST).
- Может содержать данные, не прошедшие санитизацию.
- Медленнее, чем обращение к конкретному массиву.
Как извлечь HTTP заголовки запроса?
Функция getallheaders() возвращает ассоциативный массив заголовков. Альтернатива: $_SERVER['HTTP_*']. Цель: доступ к авторisation, content-type, accept и т.д.
$headers = getallheaders();
$auth = $headers['Authorization'] ?? '';
Случаи: проверка токена, обработка CORS, согласование контента.
Проблема:
- getallheaders() доступна только в SAPI (не в CLI).
- Ключи в $_SERVER пишутся в верхнем регистре с заменой дефисов на подчёркивания (например, HTTP_HOST).
Как принять загруженные файлы?
Массив $_FILES содержит информацию о файлах, отправленных методом POST с enctype="multipart/form-data". Цель: загрузка файлов на сервер.
if ($_FILES['avatar']['error'] === UPLOAD_ERR_OK) {
$tmpName = $_FILES['avatar']['tmp_name'];
move_uploaded_file($tmpName, 'uploads/' . basename($_FILES['avatar']['name']));
}
Случаи: аватарки, документы, медиа.
Типичные ошибки:
- Не проверяется ошибка загрузки (UPLOAD_ERR_OK).
- Использование оригинального имени без санитизации (уязвимость path traversal).
- Превышение лимита размера файла (upload_max_filesize).
Расширенные примеры получения серверных переменных
Пример 1: Извлечение всех GET параметров с фильтрацией
// Получение всех параметров из GET
$params = filter_input_array(INPUT_GET, [
'name' => FILTER_SANITIZE_STRING,
'email' => FILTER_VALIDATE_EMAIL,
'age' => ['filter' => FILTER_VALIDATE_INT, 'options' => ['min_range' => 1, 'max_range' => 150]]
]);
print_r($params);
Array
(
[name] => Иван
[email] => ivan@example.com
[age] => 30
)
Пояснение: filter_input_array применяет разные фильтры к каждому ключу, возвращая отфильтрованные значения или false/null.
Пример 2: Чтение JSON запроса и извлечение поля
$json = file_get_contents('php://input');
$data = json_decode($json, true);
if (json_last_error() === JSON_ERROR_NONE) {
$username = $data['username'] ?? 'гость';
echo "Привет, $username";
} else {
http_response_code(400);
echo 'Некорректный JSON';
}
Привет, Alex
Пояснение: после декодирования проверяется ошибка, затем извлекается поле с ??.
Пример 3: Получение IP адреса клиента через $_SERVER с учётом прокси
$ip = $_SERVER['REMOTE_ADDR'];
if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'])[0];
}
// Если запрос идёт напрямую: 192.168.1.1 // Если через прокси: 203.0.113.5 (крайний клиентский IP из X-Forwarded-For)
Пояснение: REMOTE_ADDR всегда содержит IP последнего сетевого узла, а HTTP_X_FORWARDED_FOR может содержать цепочку прокси.
Пример 4: Загрузка файла с валидацией типа и размера
$maxSize = 2 * 1024 * 1024; // 2 MB
$allowedTypes = ['image/jpeg', 'image/png'];
if ($_FILES['file']['error'] === UPLOAD_ERR_OK) {
$type = mime_content_type($_FILES['file']['tmp_name']);
$size = $_FILES['file']['size'];
if (in_array($type, $allowedTypes) && $size <= $maxSize) {
move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/' . uniqid() . '.jpg');
} else {
echo 'Недопустимый тип или размер';
}
} else {
echo 'Ошибка загрузки';
}
// Файл сохранён в uploads/63f1a2b3c4d5e.jpg // или сообщение об ошибке
Пояснение: mime_content_type определяет реальный MIME, а не только расширение; uniqid() предотвращает перезапись.
Пример 5: Обработка массива параметров через фильтры
// POST запрос с массивом: items[]=1&items[]=2&items[]=abc
$items = filter_input(INPUT_POST, 'items', FILTER_VALIDATE_INT, ['flags' => FILTER_REQUIRE_ARRAY]);
if ($items !== null && $items !== false) {
$validItems = array_filter($items, fn($v) => $v !== false);
print_r($validItems);
}
Array
(
[0] => 1
[1] => 2
)
Пояснение: FILTER_REQUIRE_ARRAY обрабатывает много знаяения, FILTER_VALIDATE_INT отбрасывает нечисловые элементы.