# Суперглобални променливи: $_GET, $_POST, $_FILES и др.

> PHP суперглобалните променливи, обяснени: какво стои в $_GET, $_POST, $_FILES и $_SERVER, как PHP ги запълва преди Вашия код и как да ги ползвате сигурно.

Източник: https://phpsos.de/bg/php/superglobals/  
Актуалност: 25.10.2026  
Доставчик: PHP SOS, Спешна помощ за PHP и сигурност на сървъри. Незабавна помощ по WhatsApp: https://wa.me/491736494914?text=%D0%97%D0%B4%D1%80%D0%B0%D0%B2%D0%B5%D0%B9%D1%82%D0%B5%2C%20PHP%20SOS%2C%20%D0%B8%D0%BC%D0%B0%D0%BC%D0%B5%20%D0%BD%D1%83%D0%B6%D0%B4%D0%B0%20%D0%BE%D1%82%20%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%20%D1%81%20%D0%BD%D0%B0%D1%88%D0%B8%D1%8F%20PHP%20%D1%81%D1%8A%D1%80%D0%B2%D1%8A%D1%80.%20%D0%A4%D0%B8%D1%80%D0%BC%D0%B0%3A%20%E2%80%A6%20%D0%A3%D0%B5%D0%B1%D1%81%D0%B0%D0%B9%D1%82%3A%20%E2%80%A6

**Накратко:** Суперглобалните променливи са предварително дефинирани масиви, които PHP запълва автоматично при всяка заявка и които са достъпни навсякъде в кода. `$_GET` съдържа параметрите от адреса, `$_POST` данните от формулярите, `$_FILES` качените файлове, `$_COOKIE` бисквитките, а `$_SERVER` данни за заявката и сървъра. PHP създава тези масиви, преди да стартира кодът на Вашето приложение. Затова уязвимости именно в тази обработка, както при PHP2Shell, не могат да бъдат прихванати чрез проверки в приложението.

## Какво са суперглобалните променливи?

В PHP една променлива обикновено важи само във функцията, в която е създадена. Суперглобалните променливи са изключението: те са на разположение във всеки обхват, без да е нужно да се вземат с `global`. Ръководството на PHP назовава девет от тях.

За нетехническите хора това може да се опише така: суперглобалните променливи са пощенската кутия на приложението. Всичко, което посетителят изпрати, попада там, преди приложението да го прочете. И всичко в пощенската кутия потенциално идва от непознат.

## Суперглобалните променливи накратко

| Суперглобална променлива | Съдържание | Произход |
|---|---|---|
| `$_GET` | параметри от адреса (query string) | клиент |
| `$_POST` | полета на формуляр от POST заявка | клиент |
| `$_FILES` | данни за качените файлове | клиент, обработени от PHP |
| `$_COOKIE` | бисквитки, изпратени от браузъра | клиент |
| `$_REQUEST` | смес от GET, POST и евентуално бисквитки | клиент |
| `$_SERVER` | заглавни редове на заявката, метод, пътища, данни за сървъра | уеб сървър и клиент смесено |
| `$_ENV` | променливи на средата | сървър |
| `$_SESSION` | данни на текущата сесия | памет на сървъра |
| `$GLOBALS` | всички глобални променливи | скрипт |

Особено коварна е `$_SERVER`. Според ръководството PHP създава за всеки заглавен ред на заявката запис с `HTTP_` в началото, например `HTTP_USER_AGENT`. Тези стойности се задават от самия клиент. И `SERVER_NAME` според ръководството може да съдържа предоставеното от клиента име на хост и не е надеждно за решения, свързани със сигурността.

## Как PHP запълва суперглобалните променливи

Преди да се изпълни първият знак на Вашия скрипт, PHP вече е работил. Той чете адреса, заглавните редове и съдържанието на заявката, разчленява ги и поставя резултатите в масивите. Този етап се управлява от няколко настройки:

1. **`variables_order`** (по подразбиране `EGPCS`) определя кои суперглобални променливи изобщо се създават: Environment, GET, POST, Cookie, Server.
2. **`request_order`** (по подразбиране празен) определя от какво се образува `$_REQUEST`. Ако е празен, важи `variables_order`. Доставяните файлове php.ini според ръководството пропускат бисквитките от съображения за сигурност.
3. **`max_input_vars`** (по подразбиране `1000`) и **`max_input_nesting_level`** (по подразбиране `64`) ограничават броя и вложеността на входните променливи.
4. **`post_max_size`** (по подразбиране `8M`) ограничава съдържанието на заявката. Ако една заявка е по-голяма, `$_POST` и `$_FILES` остават празни.
5. **`enable_post_data_reading`** (по подразбиране включена) управлява дали PHP изобщо оценява автоматично съдържанието на POST заявките.

Ако `enable_post_data_reading` е изключена, приложението чете суровото съдържание само през `php://input`. От PHP 8.4.0 има допълнително `request_parse_body()`, което оценява данните от формуляри и качвания и за други методи освен POST и позволява собствени гранични стойности. Как протича частта с качването в детайли, обяснява страницата [Как PHP обработва качването на файлове](https://phpsos.de/bg/php/datei-uploads-intern/).

## Сигурна работа с данните от заявките

Основното правило е просто: всяка стойност от `$_GET`, `$_POST`, `$_COOKIE`, `$_FILES` и записите `HTTP_` на `$_SERVER` е чужд вход. Тя се проверява при приемането и се екранира подходящо при извеждането.

```php
<?php
declare(strict_types=1);

// Очаква се цяло число: проверка вместо сляпо преобразуване
$seite = filter_var($_GET['seite'] ?? '1', FILTER_VALIDATE_INT, [
    'options' => ['min_range' => 1, 'max_range' => 500],
]);
if ($seite === false) {
    http_response_code(400);
    exit('Ungültige Seitenzahl');
}

// Позволявай само разрешени стойности
$sortierung = in_array($_GET['sort'] ?? '', ['name', 'datum'], true)
    ? $_GET['sort']
    : 'datum';

// Изходът винаги се екранира
echo htmlspecialchars($_POST['kommentar'] ?? '', ENT_QUOTES, 'UTF-8');
```

Честа клопка са данните за произхода на една заявка. Ако пред уеб сървъра стои reverse proxy, load balancer или CDN, `$_SERVER['REMOTE_ADDR']` съдържа адреса на този посредник, а не на посетителя. Истинският адрес тогава стои в заглавен ред като `X-Forwarded-For`, който обаче всеки клиент може да зададе сам. Приложението бива да оценява такива заглавни редове само ако заявката доказано идва от собствен, известен proxy. Иначе блокиранията по IP адрес или протоколите лесно могат да бъдат подведени. Сходно важи за `HTTPS`: ако криптирането завършва при proxy, приложението трябва изрично да знае, че първоначалната връзка е била криптирана.

Допълнителни шаблони за валидиране и филтриране показва статията [Валидиране и филтриране на входа в PHP](https://phpsos.de/bg/blog/eingaben-validieren-php/). За данните на сесията в `$_SESSION` важат собствени правила; те са описани на страницата [Сесии и бисквитки в PHP](https://phpsos.de/bg/php/sessions-und-cookies/).

## Суперглобални променливи и PHP2Shell: какво става преди Вашия код

Тук е връзката с актуалното положение. [CVE-2026-109618](https://phpsos.de/bg/php2shell/cve-2026-109618/) описва, че състояние на изчерпана памет (out-of-memory) може да прекъсне PHP, докато данните от заявката са инициализирани само частично; при почистването на заявката невалидни данни след това могат да бъдат третирани като валидни. При CVE-2026-109619 вътрешно състояние на заявка може да остане след освобождаването на паметта и да бъде използвано от по-късна заявка в същия работен процес.

И двете уязвимости са следователно в обработката, която PHP сам извършва около заявката, а не в кода на приложението. Екипът на PHP оценява риска при mod_php като най-висок; там е показан експлойт, преди изобщо да се изпълни код на приложението. Никакъв `filter_var()` и никаква проверка в приложението не може да предотврати това.

> **Действайте веднага:**
> Задължителни са актуализацията до PHP 8.5.12, 8.4.27, 8.3.36 или 8.2.35 и рестартирането на всички PHP процеси. Временните мерки от php.net, например по-тесни граници за `post_max_size`, не са пълна защита.

## Как помага PHP SOS конкретно?

- Проверяваме ефективните гранични стойности за данните на заявките за всеки уебсайт и ги задаваме съобразно приложението.
- Внасяме актуализацията на PHP, рестартираме всички работни процеси и доказваме състоянието на корекциите в рамките на нашата [услуга за PHP корекции](https://phpsos.de/bg/leistungen/php-patch-service/).
- Проверяваме собствените разработки дали стойности от суперглобални променливи стигат непроверени до база данни, файлова система или изход.
- Запазваме логовете на уеб сървъра от 20.10.2026 г., за да остане възможен по-късен анализ.


## Често задавани въпроси

**Колко суперглобални променливи има в PHP?**  
Ръководството на PHP назовава девет: $GLOBALS, $_SERVER, $_GET, $_POST, $_FILES, $_COOKIE, $_SESSION, $_REQUEST и $_ENV. Те са достъпни във всеки обхват, и във функции, и в методи.

**Достоверни ли са стойностите в $_SERVER?**  
Само отчасти. Записите с HTTP_ в началото идват от заглавните редове на заявката на клиента. Ръководството предупреждава например, че SERVER_NAME може да отразява предоставеното от клиента име на хост и не е надеждно за решения, свързани със сигурността.

**Защо $_POST понякога е празен, макар да е изпратен формуляр?**  
Най-честата причина е заявка, по-голяма от post_max_size. Тогава $_POST и $_FILES според ръководството остават празни. Към същото води и изключена настройка enable_post_data_reading.

**Трябва ли да се ползва $_REQUEST?**  
По-добре не. $_REQUEST смесва данни от различни източници и кой източник печели, зависи от request_order и variables_order. Четете стойностите целенасочено от $_GET или $_POST.

## Източници

- [Ръководство на PHP: Суперглобални променливи](https://www.php.net/manual/de/language.variables.superglobals.php)
- [Ръководство на PHP: $_SERVER](https://www.php.net/manual/en/reserved.variables.server.php)
- [Ръководство на PHP: директиви на php.ini](https://www.php.net/manual/de/ini.core.php)
- [Ръководство на PHP: request_parse_body](https://www.php.net/manual/en/function.request-parse-body.php)
