# phpinfo() datoteke: zašto moraju nestati

> Zaboravljena phpinfo datoteka otkriva putanje, module i ponekad pristupne podatke. Kako ih pronaći, ukloniti i sigurnije provjeriti PHP.

Izvor: https://phpsos.de/hr/blog/phpinfo-dateien-entfernen/  
Stanje: 25.10.2026  
Pružatelj: PHP SOS, PHP hitna pomoć i sigurnost poslužitelja. Hitna pomoć putem WhatsAppa: https://wa.me/491736494914?text=Pozdrav%20PHP%20SOS%2C%20trebamo%20pomo%C4%87%20s%20na%C5%A1im%20PHP%20poslu%C5%BEiteljem.%20Tvrtka%3A%20%E2%80%A6%20Web-stranica%3A%20%E2%80%A6

**Ukratko:** Datoteka koja samo poziva `phpinfo()` svakom posjetitelju pokazuje verziju, module, putanje i postavke PHP-a, često i varijable okruženja s pristupnim podacima. Za sigurnost phpinfo-a stoga vrijedi: takve datoteke nikad ne ostavljati trajno u webrootu, brisati ih nakon uporabe, a stanje PHP-a radije provjeravati preko upravljanja paketima i konfiguracije. Stanje zakrpe protiv PHP2Shella phpinfo ispis ionako ne dokazuje.

## Testna datoteka koja ostaje

Od 21. 10. 2026. tisuće administratora provjeravaju koju PHP verziju isporučuju njihove web-stranice. Najbrži put je poznat: stvoriti datoteku `info.php` s jednim jedinim retkom, pozvati je u pregledniku, pročitati rezultat. To radi. Problem počinje poslije, kad se datoteka zaboravi.

Takve datoteke preživljavaju začuđujuće dugo. Sele se pri selidbama, završavaju u sigurnosnim kopijama i nakon godina se pojavljuju u direktorijima koje više nitko ne poznaje. Automatizirani skeneri neprestano pozivaju tipične nazive datoteka. Što je administratoru bila pomoć, napadaču je nacrt poslužitelja.

Osobito su pogođene agencije i hosteri s mnogo web-stranica klijenata. Tko u užurbanom tjednu provjerava desetke web-stranica, brzo stvori desetke testnih datoteka. Jedan jedini zaboravljeni direktorij dovoljan je da datoteka mjesecima kasnije još bude dostupna.

## Što phpinfo() otkriva i zašto je to važno za sigurnost

Prema PHP priručniku `phpinfo()` ispisuje trenutačno stanje PHP-a. Konstantama se može upravljati koji dijelovi se pojavljuju; bez navoda to je sve.

| Područje (konstanta) | Sadržaj prema priručniku | Zašto je osjetljivo |
|---|---|---|
| `INFO_GENERAL` | build, lokacija php.ini, web-poslužitelj, sustav | otkriva operacijski sustav i putanje |
| `INFO_CONFIGURATION` | lokalne i master vrijednosti svih direktiva | pokazuje djeluju li `disable_functions` ili `open_basedir` |
| `INFO_MODULES` | učitana proširenja s postavkama | napadači vide koje su funkcije dostupne |
| `INFO_ENVIRONMENT` | varijable okruženja | ovdje često stoje pristupni podaci za bazu ili API |
| `INFO_VARIABLES` | unaprijed definirane varijable (Environment, GET, POST, Cookie, Server) | sadrži zaglavlja i kolačiće trenutačnog zahtjeva |

Najopasniji su posljednja dva retka. Moderne aplikacije pristupne podatke rado učitavaju iz varijabli okruženja, primjerice iz `.env` datoteke ili iz konfiguracije containera. Te vrijednosti tada stoje u ispisu kao otvoreni tekst. Kako se takve tajne u načelu štite, opisuje članak [Ispravno zaštititi pristupne podatke i .env datoteke](https://phpsos.de/hr/blog/env-dateien-schuetzen/).

Tome se pridodaje: ispis pokazuje vrijednosti tekućeg zahtjeva, dakle i kolačiće i zaglavlja. Ako napadač može posjetitelja usmjeriti na stranicu i pročitati odgovor, primjerice preko Cross-Site-Scripting ranjivosti na drugom mjestu, vidljivi postaju čak i kolačići označeni kao HttpOnly.

## Zašto phpinfo nije dokaz protiv PHP2Shella

Mnogi su datoteku stvorili upravo da provjere stanje zakrpe. Za to je prikladna samo uvjetno. Distribucije i hosteri ispravke često primjenjuju kao backport; prema izvješćima Ubuntu 24.04 nakon updatea i dalje prikazuje 8.3.6. Prikazani broj dakle govori malo. Obrnuto, aktualan broj ne dokazuje da su svi workeri ponovno pokrenuti.

Pouzdano je stanje paketa s CVE brojevima u changelogu, dopunjeno ponovnim pokretanjem svih PHP procesa. Kako to ide, objašnjava članak [Ispravno provjeriti PHP verziju i stanje zakrpe](https://phpsos.de/hr/php2shell/php-version-pruefen/).

Kratkotrajan ispis u web-kontekstu ipak ima svoje mjesto: pokazuje koji php.ini i koje vrijednosti doista vrijede za web-stranicu, jer naredbena linija često čita drugu konfiguraciju. Pozadinu o razinama i prednosti objašnjava [php.ini objašnjen](https://phpsos.de/hr/php/php-ini-erklaert/). Ako Vam to treba, onda zaštićeno pristupom, sa slučajnim nazivom datoteke i samo na nekoliko minuta.

Za većinu pitanja ionako postoje bolji putovi. PHP verzija FPM poola stoji u njegovoj konfiguraciji i u popisu procesa. Pojedinačne vrijednosti mogu se skriptom izvan webroota dohvatiti pomoću `ini_get()`, a da se ne otkrije sve. A u hosting panelima sučelje prikazuje dodijeljenu verziju po web-stranici, iako bez izjave o backportima.

## Pronaći zaboravljene datoteke: konkretni koraci provjere

Ovako na Linux poslužitelju pronalazite naslijeđene ostatke. Naredbe samo čitaju i ništa ne mijenjaju.

1. **Potražiti datoteke s pozivom phpinfo** (prilagoditi putanju):

```bash
grep -rlE "phpinfo[[:space:]]*\(" /var/www --include="*.php" 2>/dev/null
```

2. **Provjeriti tipične nazive datoteka**, i bez pogotka u sadržaju:

```bash
find /var/www -type f \( -iname "info.php" -o -iname "phpinfo.php" -o -iname "test.php" -o -iname "i.php" \) 2>/dev/null
```

3. **Ocijeniti pogotke:** nije svako nalazište testna datoteka. Administratorski alati, paneli ili frameworci mogu koristiti `phpinfo()` iza prijave. Odlučuje je li datoteka dostupna s interneta bez prijave.

4. **Pogledati pristupe u zapisniku** prije brisanja:

```bash
grep -E "GET /(info|phpinfo|test|i)\.php" /var/log/nginx/access.log* 2>/dev/null | tail -n 50
```

5. **Obrisati i zamijeniti tajne:** ako je u ispisu stajala lozinka ili ključ, a datoteka je bila javna, vrijednost se smatra poznatom. Promijenite je.

> **Savjet:**
> Nalazište s nepoznatim datumom izrade i upadljivim sadržajem pokraj poziva phpinfo može biti i stražnja vrata. Tada ne samo obrisati, nego osigurati i dati provjeriti, vidi [Prepoznati i ukloniti webshellove](https://phpsos.de/hr/ratgeber/webshell-erkennen/).

## Trajno spriječiti umjesto čistiti

Tri mjere osiguravaju da se tema ne vrati. Prvo: `phpinfo` uvrstiti na popis `disable_functions` u php.ini za web-kontekst. Prethodno provjerite treba li Vaš panel funkciju za stranicu statusa. Kako postavka djeluje i gdje su njezine granice, stoji u članku [Ispravno koristiti disable_functions](https://phpsos.de/hr/ratgeber/disable-functions/).

```ini
; php.ini za FPM ili Apache, nakon toga ponovno pokrenuti sve PHP procese
disable_functions = phpinfo
expose_php = Off
```

Drugo: postavljanje samo preko čvrstog postupka, primjerice putem Gita ili build pipelinea, kako pojedinačne datoteke ne bi ručno dospijevale u webroot. Treće: informacije o statusu pripadaju u nadzor ili inventar, a ne na javnu stranicu.

`expose_php = Off` dodatno uklanja zaglavlje kojim PHP u svakom odgovoru priopćava svoju verziju. To ne zamjenjuje update, ali automatiziranim skenerima oduzima zgodnu informaciju. Tko ima više osoba s pristupom poslužitelju, trebao bi uz to dogovoriti jednostavno pravilo: testne datoteke brišu se u istom radnom koraku u kojem su stvorene, a ne tek „kasnije“.

## Kako PHP SOS konkretno pomaže?

- Pretražujemo Vaše webrootove u potrazi za phpinfo datotekama, testnim skriptama i drugim naslijeđenim ostacima te ocjenjujemo svako nalazište.
- Analiziramo pristupe pronađenim datotekama i kažemo Vam koje biste tajne trebali zamijeniti.
- Stanje zakrpe protiv PHP2Shella dokazujemo preko changelog paketa i pokretanja procesa, a ne prikazom verzije.
- `disable_functions`, `expose_php` i druga ojačavanja trajno provodimo u okviru [ojačavanja poslužitelja](https://phpsos.de/hr/leistungen/server-haertung/).

**Zaključak:** phpinfo datoteka se stvori u sekundama i jednako brzo zaboravi. Tko je sada potraži i ukloni, zatvara nepotrebno curenje podataka i pri stanju zakrpe oslanja se na pouzdane dokaze.


## Česta pitanja

**Je li phpinfo datoteka sama po sebi sigurnosna ranjivost?**  
Ne otvara pristup, ali napadačima daje detaljan opis poslužitelja: verziju, module, putanje, postavke i, ovisno o okruženju, varijable okruženja. To olakšava ciljane napade i može otkriti pristupne podatke.

**Dokazuje li broj verzije u phpinfo da je PHP2Shell zakrpan?**  
Ne. Distribucije i hosteri ispravke često primjenjuju kao backport, pa prikazani broj ostaje isti. Stanje zakrpe dokazuju changelog paketa i potvrda pružatelja, uz ponovno pokretanje svih PHP procesa.

**Što učiniti ako je phpinfo datoteka dulje vrijeme bila javna?**  
Obrisati datoteku, u access zapisniku provjeriti tko ju je dohvaćao i zamijeniti sve tajne koje su stajale u ispisu, primjerice lozinke baza podataka ili API ključeve iz varijabli okruženja.

**Mogu li phpinfo() potpuno isključiti?**  
Da, pomoću disable_functions u php.ini web-konteksta. Prethodno provjerite koristi li panel ili aplikacija funkciju za stranice statusa, a PHP procese nakon toga ponovno pokrenite.

## Izvori

- [PHP priručnik: phpinfo()](https://www.php.net/manual/de/function.phpinfo.php)
- [OWASP Top 10](https://owasp.org/www-project-top-ten/)
- [php.net: sigurnosne objave](https://www.php.net/)
