# Ispravna uporaba PHP disable_functions

> Ispravna uporaba PHP disable_functions: koje funkcije zabraniti, kako prethodno provjeriti aplikaciju i gdje ojačavanje dolazi do svojih granica.

Izvor: https://phpsos.de/hr/ratgeber/disable-functions/  
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:** Uz PHP disable_functions zabranjujete funkcije putem kojih PHP izvršava sistemske naredbe, primjerice `exec`, `shell_exec` ili `proc_open`. To napadačima nakon provale otežava sljedeći korak. Postavka djeluje samo iz php.ini ili FPM poola, mora odgovarati aplikaciji i ne zamjenjuje ažuriranje.

## Zašto je disable_functions upravo sada smislen

Kod PHP2Shella radi se o izvršavanju zlonamjernog koda izdaleka bez prijave. Dvije ranjivosti CVE-2026-109618 i CVE-2026-109619 nalaze se u samom PHP interpreteru, a ispravljene su u PHP-u 8.5.12, 8.4.27, 8.3.36 i 8.2.35. Ažuriranje je jedini način da se zatvore.

Ojačavanje djeluje razinu kasnije. Tko jednom može izvršavati kod na poslužitelju, obično želi dalje: pokretati sistemske naredbe, naknadno učitavati alate, postaviti trajna stražnja vrata. Mnogi od tih koraka prolaze kroz malo PHP funkcija. Ako su zabranjene, put postaje mukotrpniji i upadljiviji.

disable_functions stoga nije zamjena za zakrpe, nego sastavni dio za slučaj da unatoč svakom oprezu nešto prođe. To vrijedi za buduće ranjivosti jednako kao i za PHP2Shell.

## Što PHP disable_functions postiže, a što ne

Postavka uklanja navedene funkcije iz izvršnog okruženja. Ako skripta pozove zabranjenu funkciju, PHP prekida rad s pogreškom. Zabrana vrijedi za svaki kod koji radi u tom PHP procesu, dakle i za ubačeni kod.

Granice trebate poznavati:

- Postavka nije zatvoreni zaštićeni prostor. PHP ekstenzije, pogreške u interpreteru ili programi izvan PHP-a mogu je zaobići.
- Ne sprječava napadača da čita ili piše datoteke kojima PHP korisnik ima pristup. Za to su zaduženi prava datoteka i izolacija.
- Djeluje samo iz php.ini ili kao `php_admin_value`. Putem `ini_set()`, `.user.ini` ili `.htaccess` ne može se postaviti.

Najviše disable_functions donosi zajedno s urednom php.ini, zasebnim korisnicima po web-stranici i restriktivnim pravima datoteka. Osnove su u vodiču [Sigurna konfiguracija php.ini](https://phpsos.de/hr/ratgeber/php-ini-sicher-konfigurieren/).

## Koje funkcije trebate zabraniti

Za tipične web-stranice bez potrebe za sistemskim naredbama sljedeći se popis pokazao dobrim. Obuhvaća funkcije za pokretanje procesa i upravljanje pokrenutim procesima.

| Skupina | Funkcije | Tipična legitimna uporaba |
|---|---|---|
| Izvršavanje naredbi | `exec`, `shell_exec`, `system`, `passthru` | Obrada slika, sigurnosne kopije putem skripte |
| Otvaranje procesa | `proc_open`, `popen` | Composer, PDF alati, slanje e-pošte |
| Upravljanje procesima | `proc_nice`, `proc_terminate`, `proc_get_status` | Redovi čekanja, pozadinski poslovi |
| Administracija procesa | `pcntl_exec`, `pcntl_fork` | uglavnom samo u naredbenom retku |
| Signali i prava | `posix_kill`, `posix_setuid` | rijetko u web-radu |

Kao konfiguracija to izgleda ovako:

```ini
; php.ini web načina rada, npr. /etc/php/8.3/fpm/php.ini
disable_functions = exec,shell_exec,system,passthru,proc_open,popen,proc_nice,proc_terminate,proc_get_status,pcntl_exec,pcntl_fork,posix_kill,posix_setuid
```

Ako popis ne vrijedi za sve web-stranice na poslužitelju, postavite ga po FPM poolu. Nakon ponovnog učitavanja provjerite koji popis u tom poolu zaista vrijedi:

```ini
; /etc/php/8.3/fpm/pool.d/meine-seite.conf (izvadak)
php_admin_value[disable_functions] = exec,shell_exec,system,passthru,proc_open,popen
```

## Prethodna provjera aplikacije: tako izbjegavate ispade

Tko popis postavi neprovjereno, riskira da smanjivanje slika, PDF računi ili slanje e-pošte odjednom prestanu raditi. Zato prethodno u kodu potražite pogođene funkcije:

```bash
# Gdje se i koliko često funkcije koriste u kodu?
grep -rnoE "\b(exec|shell_exec|system|passthru|proc_open|popen|pcntl_exec)\s*\(" /var/www/meine-seite --include="*.php" \
  | cut -d: -f1 | sort | uniq -c | sort -rn | head -30
```

Pogoci automatski ne znače da se funkcija u radu zaista treba. Mnoge biblioteke najprije provjere je li funkcija dostupna, a inače odabiru zaobilazno rješenje. Odlučujući je test u staging okruženju sa svim važnim procesima: narudžba, račun, slanje obrasca, upload slike, planirani zadaci.

Ako aplikacija nužno zahtijeva neku od tih funkcija, provjerite sistemske zahtjeve proizvođača na njegovoj službenoj stranici. Zadatak se često može premjestiti u zaseban pool ili skriptu naredbenog retka koja nije dostupna putem weba.

## Aktivacija postavke i provjera učinka

Nakon promjene PHP mora ponovno učitati konfiguraciju. Zatim provjerite vrijednost u načinu rada svoje web-stranice, a ne u naredbenom retku:

```bash
sudo systemctl reload php8.3-fpm
php-fpm8.3 -i | grep "^disable_functions"
# Provjeriti log pogrešaka na pozive zabranjenih funkcija
sudo grep -i "has been disabled" /var/log/php/*.log | tail -20
```

Poruke u logu pogrešaka vrijedne su i kasnije. Ako se tamo odjednom pojave pozivi zabranjenih funkcija iako ih Vaša aplikacija ne koristi, to može upućivati na ubačeni kod. Kako dalje postupiti, opisuje vodič [Prepoznavanje i uklanjanje webshellova](https://phpsos.de/hr/ratgeber/webshell-erkennen/).

## Tipične pogreške pri uporabi disable_functions

U praksi se ojačavanje rijetko slomi na tehnici, nego na sitnicama. Ove su pogreške osobito raširene:

- **Promijenjena pogrešna datoteka:** Popis stoji samo u php.ini naredbenog retka, a web-stranica radi preko PHP-FPM-a i ostaje nezaštićena.
- **Bez ponovnog pokretanja:** Datoteka je ispravna, ali pokrenuti procesi još rade sa starom konfiguracijom.
- **Zabranjeno preširoko:** Funkcije poput `ini_set` ili `mail` zabranjene su usput i važni procesi neprimjetno prestaju raditi. Pogreške se tada često uoče tek nakon nekoliko dana, primjerice kad izostanu potvrde narudžbi.
- **Jednom postavljeno, nikad provjereno:** Nakon selidbe, promjene verzije PHP-a ili nove instalacije putem hosting panela popis je nestao.
- **Lažan osjećaj sigurnosti:** Zabrana se shvaća kao zamjena za ažuriranja. Ona ipak ne zatvara ranjivost u interpreteru.

Provjeru aktivne vrijednosti stoga uvrstite u svoju rutinu nakon svakog PHP ažuriranja. Dovoljan je kratak pogled, jedva traje i sprječava da se ojačavanje tiho izgubi.

> **Savjet:**
> Kod više web-stranica na jednom poslužitelju: za svaku web-stranicu postavite zaseban pool s vlastitim popisom. Dopunski [open_basedir](https://phpsos.de/hr/ratgeber/open-basedir/) ograničava direktorije kojima PHP smije pristupati.

## Kako PHP SOS konkretno pomaže?

- Provjeravamo kod i procese Vaše aplikacije na uporabu kritičnih funkcija.
- Za svaku web-stranicu određujemo prikladan popis zabrana i testiramo ga prije puštanja u rad.
- Zabranu kombiniramo s poolovima, pravima datoteka i bilježenjem u skladan koncept ojačavanja.
- Postavke dokumentiramo i nadziremo log pogrešaka zbog upadljivih poziva.

Kako to teče kao cjelovit paket, opisuje usluga [Ojačavanje poslužitelja za PHP web-poslužitelje](https://phpsos.de/hr/leistungen/server-haertung/).


## Česta pitanja

**Mogu li disable_functions postaviti putem ini_set() ili .htaccess?**  
Ne. Postavka djeluje samo iz php.ini ili kao php_admin_value u FPM poolu odnosno u Apache konfiguraciji. Tijekom rada ne može se postaviti, a aplikacija zabranjene funkcije ne može ni ponovno odobriti.

**Štiti li disable_functions od PHP2Shella?**  
Ne. PHP2Shell pogađa sam PHP interpreter, a ranjivost se zatvara samo ažuriranjem. Zabranjene funkcije ipak mogu ograničiti prostor djelovanja napadača nakon uspješnog iskorištavanja.

**Zašto php -i prikazuje drugačiji popis od moje web-stranice?**  
Naredbeni redak često čita vlastitu php.ini. Za web-stranicu je mjerodavna konfiguracija PHP-FPM-a, mod_php-a ili LiteSpeeda. Vrijednost stoga provjerite u načinu rada preko kojeg radi Vaša web-stranica.

**Koje aplikacije trebaju proc_open ili exec?**  
To ovisi o aplikaciji. Tipični su obrada slika putem vanjskih programa, izrada PDF-ova, slanje e-pošte putem sendmaila ili alati poput Composera. Provjerite to u kodu i u sistemskim zahtjevima proizvođača.

## Izvori

- [php.net: sigurnosne objave](https://www.php.net/)
- [OWASP Cheat Sheet Series](https://cheatsheetseries.owasp.org/)
- [BSI IT-Grundschutz (njemački standard)](https://www.bsi.bund.de/DE/Themen/Unternehmen-und-Organisationen/Standards-und-Zertifizierung/IT-Grundschutz/it-grundschutz_node.html)
