# Pravilna uporaba PHP disable_functions

> Pravilna uporaba PHP disable_functions: katere funkcije blokirate, kako aplikacijo preverite vnaprej, da ne odpove, in kje utrjevanje naleti na meje.

Vir: https://phpsos.de/sl/ratgeber/disable-functions/  
Stanje: 25.10.2026  
Ponudnik: PHP SOS, Nujna pomoč za PHP in varnost strežnikov. Takojšnja pomoč po WhatsAppu: https://wa.me/491736494914?text=Pozdravljeni%2C%20PHP%20SOS%2C%20potrebujemo%20pomo%C4%8D%20z%20na%C5%A1im%20stre%C5%BEnikom%20PHP.%20Podjetje%3A%20%E2%80%A6%20Spletna%20stran%3A%20%E2%80%A6

**Na kratko:** S PHP disable_functions blokirate funkcije, prek katerih PHP izvaja sistemske ukaze, na primer `exec`, `shell_exec` ali `proc_open`. To napadalcem po vdoru otežuje naslednji korak. Nastavitev deluje samo iz php.ini ali poola FPM, mora ustrezati aplikaciji in posodobitve ne nadomesti.

## Zakaj je disable_functions smiseln prav zdaj

Pri PHP2Shell gre za izvajanje škodljive kode na daljavo brez prijave. Ranljivosti CVE-2026-109618 in CVE-2026-109619 sta v samem interpreterju PHP, odpravljeni v PHP 8.5.12, 8.4.27, 8.3.36 in 8.2.35. Posodobitev je edini način, da ju zaprete.

Utrjevanje posega eno raven pozneje. Kdor enkrat lahko izvede kodo na strežniku, običajno hoče naprej: zagnati sistemske ukaze, naložiti orodja, vzpostaviti trajna stranska vrata. Številni od teh korakov tečejo prek maloštevilnih funkcij PHP. Če so blokirane, je pot bolj mukotrpna in bolj opazna.

disable_functions zato ni nadomestilo za popravke, ampak gradnik za primer, da kljub vsej previdnosti kaj prodre. To velja za prihodnje ranljivosti enako kot za PHP2Shell.

## Kaj PHP disable_functions zmore in česa ne

Nastavitev navedene funkcije odstrani iz izvajalnega okolja. Če skripta pokliče blokirano funkcijo, PHP prekine z napako. Blokada velja za vsako kodo, ki teče v tem procesu PHP, torej tudi za vneseno kodo.

Meje poznajte:

- Nastavitev ni zaprt zaščitni prostor. Razširitve PHP, napake v interpreterju ali programi zunaj PHP jo lahko zaobidejo.
- Ne prepreči, da napadalec bere ali piše datoteke, do katerih ima dostop uporabnik PHP. Za to so pristojne pravice datotek in izolacija.
- Deluje samo iz php.ini ali kot `php_admin_value`. Z `ini_set()`, `.user.ini` ali `.htaccess` je ni mogoče nastaviti.

Največ disable_functions prinese skupaj s čisto php.ini, lastnimi uporabniki za vsako spletno stran in restriktivnimi pravicami datotek. Osnove so v vodniku [Varna konfiguracija php.ini](https://phpsos.de/sl/ratgeber/php-ini-sicher-konfigurieren/).

## Katere funkcije naj blokirate

Za tipične spletne strani brez potrebe po sistemskih ukazih se je obneslo naslednje. Zajema funkcije za zagon procesov in za upravljanje tekočih procesov.

| Skupina | Funkcije | Tipična zakonita uporaba |
|---|---|---|
| Izvajanje ukazov | `exec`, `shell_exec`, `system`, `passthru` | Obdelava slik, varnostne kopije prek skript |
| Odpiranje procesov | `proc_open`, `popen` | Composer, orodja za PDF, pošiljanje e-pošte |
| Upravljanje procesov | `proc_nice`, `proc_terminate`, `proc_get_status` | Čakalne vrste, opravila v ozadju |
| Upravljanje procesov v sistemu | `pcntl_exec`, `pcntl_fork` | večinoma samo v ukazni vrstici |
| Signali in pravice | `posix_kill`, `posix_setuid` | redko v spletnem delovanju |

Kot konfiguracija je to videti tako:

```ini
; php.ini spletnega načina delovanja, 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
```

Če seznam ne velja za vse spletne strani na strežniku, ga nastavite za vsak pool FPM. Po ponovnem nalaganju preverite, kateri seznam v tem poolu dejansko velja:

```ini
; /etc/php/8.3/fpm/pool.d/meine-seite.conf (izvleček)
php_admin_value[disable_functions] = exec,shell_exec,system,passthru,proc_open,popen
```

## Aplikacijo preverite vnaprej: tako se izognete izpadom

Kdor seznam nastavi nepreverjeno, tvega, da zmanjševanje slik, računi v PDF ali pošiljanje e-pošte nenadoma ne bodo več delovali. Zato v kodi vnaprej poiščite zadevne funkcije:

```bash
# Kje in kako pogosto se funkcije uporabljajo v kodi?
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
```

Zadetki samodejno ne pomenijo, da se funkcija v delovanju potrebuje. Številne knjižnice najprej preverijo, ali je funkcija na voljo, sicer pa ubero drugo pot. Odločilen je preizkus v okolju staging z vsemi pomembnimi postopki: naročilo, račun, pošiljanje obrazca, nalaganje slike, načrtovana opravila.

Če aplikacija nujno zahteva eno od teh funkcij, preverite sistemske zahteve proizvajalca na njegovi uradni strani. Pogosto je nalogo mogoče prestaviti v ločen pool ali skripto ukazne vrstice, ki ni dosegljiva prek spleta.

## Aktivirajte nastavitev in preverite učinek

Po spremembi mora PHP konfiguracijo znova prebrati. Nato vrednost preverite v načinu delovanja vaše spletne strani, ne v ukazni vrstici:

```bash
sudo systemctl reload php8.3-fpm
php-fpm8.3 -i | grep "^disable_functions"
# V dnevniku napak preverite klice blokiranih funkcij
sudo grep -i "has been disabled" /var/log/php/*.log | tail -20
```

Sporočila v dnevniku napak so dragocena tudi pozneje. Če se tam nenadoma pojavijo klici blokiranih funkcij, čeprav jih vaša aplikacija ne uporablja, to lahko kaže na vneseno kodo. Kako nadaljujete, opisuje vodnik [Prepoznavanje in odstranitev webshellov](https://phpsos.de/sl/ratgeber/webshell-erkennen/).

## Tipične napake pri uporabi disable_functions

V praksi utrjevanje redko spodleti zaradi tehnike, temveč zaradi malenkosti. Te napake so posebej pogoste:

- **Spremenjena napačna datoteka:** Seznam je samo v php.ini ukazne vrstice, spletna stran teče prek PHP-FPM in ostane nezaščitena.
- **Brez ponovnega zagona:** Datoteka je pravilna, a tekoči procesi še delajo s staro konfiguracijo.
- **Preširoka blokada:** Skupaj se blokirajo funkcije, kot sta `ini_set` ali `mail`, in pomembni postopki neopazno odpovedo. Napake pogosto opazite šele po nekaj dneh, na primer ko izostanejo potrditve naročil.
- **Enkrat nastavljeno, nikoli preverjeno:** Po selitvi, menjavi različice PHP ali novi namestitvi prek upravljalnega panela gostovanja je seznam izginil.
- **Lažen občutek varnosti:** Blokada se razume kot nadomestilo za posodobitve. Ranljivosti v interpreterju pa ne zapre.

Preverjanje aktivne vrednosti zato vključite v rutino po vsaki posodobitvi PHP. Kratek pogled zadošča, vzame malo časa in prepreči, da bi se utrditev tiho izgubila.

> **Nasvet:**
> Pri več spletnih straneh na enem strežniku: za vsako spletno stran ustvarite lasten pool z lastnim seznamom. Dodatno [open_basedir](https://phpsos.de/sl/ratgeber/open-basedir/) omeji mape, do katerih sme PHP dostopati.

## Kako PHP SOS pomaga konkretno?

- Kodo in postopke vaše aplikacije preverimo glede uporabe kritičnih funkcij.
- Za vsako spletno stran določimo ustrezen seznam blokad in ga pred zagonom preizkusimo.
- Blokado združimo s pooli, pravicami datotek in beleženjem v skladen koncept utrjevanja.
- Nastavitve dokumentiramo in dnevnik napak nadzorujemo glede sumljivih klicev.

Kako to poteka kot celotni paket, opisuje storitev [Utrjevanje strežnikov PHP](https://phpsos.de/sl/leistungen/server-haertung/).


## Pogosta vprašanja

**Ali lahko disable_functions nastavim z ini_set() ali .htaccess?**  
Ne. Nastavitev deluje samo iz php.ini ali kot php_admin_value v poolu FPM oziroma v konfiguraciji Apache. Med izvajanjem je ni mogoče nastaviti, aplikacija pa blokiranih funkcij tudi ne more znova odblokirati.

**Ali disable_functions ščiti pred PHP2Shell?**  
Ne. PHP2Shell zadeva sam interpreter PHP, ranljivost zapre samo posodobitev. Blokirane funkcije pa lahko po uspešnem izkoriščanju omejijo manevrski prostor napadalca.

**Zakaj php -i prikaže drug seznam kot moja spletna stran?**  
Ukazna vrstica pogosto bere lastno php.ini. Za spletno stran šteje konfiguracija PHP-FPM, mod_php ali LiteSpeed. Vrednost zato preverite v načinu delovanja, prek katerega teče vaša spletna stran.

**Katere aplikacije potrebujejo proc_open ali exec?**  
To je odvisno od aplikacije. Značilni so obdelava slik prek zunanjih programov, ustvarjanje PDF, pošiljanje e-pošte prek sendmail ali orodja, kot je Composer. Preverite v kodi in v sistemskih zahtevah proizvajalca.

## Viri

- [php.net: varnostna obvestila](https://www.php.net/)
- [OWASP Cheat Sheet Series](https://cheatsheetseries.owasp.org/)
- [BSI IT-Grundschutz](https://www.bsi.bund.de/DE/Themen/Unternehmen-und-Organisationen/Standards-und-Zertifizierung/IT-Grundschutz/it-grundschutz_node.html)
