# PHP disable_functions pareiza lietošana

> PHP disable_functions pareiza lietošana: kuras funkcijas bloķēt, kā iepriekš pārbaudīt lietojumprogrammu un kur nostiprināšanai ir robežas.

Avots: https://phpsos.de/lv/ratgeber/disable-functions/  
Aktuāls uz: 25.10.2026  
Pakalpojuma sniedzējs: PHP SOS, PHP ārkārtas palīdzība un serveru drošība. Tūlītēja palīdzība pa WhatsApp: https://wa.me/491736494914?text=Sveiki%2C%20PHP%20SOS%2C%20mums%20nepiecie%C5%A1ama%20pal%C4%ABdz%C4%ABba%20ar%20m%C5%ABsu%20PHP%20serveri.%20Uz%C5%86%C4%93mums%3A%20%E2%80%A6%20Vietne%3A%20%E2%80%A6

**Īsi:** ar PHP disable_functions bloķējat funkcijas, ar kurām PHP izpilda sistēmas komandas, piemēram, `exec`, `shell_exec` vai `proc_open`. Tas uzbrucējam pēc ielaušanās apgrūtina nākamo soli. Iestatījums darbojas tikai no php.ini vai FPM pūla, tam jāatbilst lietojumprogrammai, un tas neaizstāj atjauninājumu.

## Kāpēc disable_functions tagad ir lietderīgs

PHP2Shell gadījumā runa ir par ļaunprātīga koda attālinātu izpildi bez pieteikšanās. Abas ievainojamības CVE-2026-109618 un CVE-2026-109619 ir pašā PHP interpretatorā, izlabotas PHP 8.5.12, 8.4.27, 8.3.36 un 8.2.35. Atjauninājums ir vienīgais veids, kā tās aizvērt.

Nostiprināšana iedarbojas par vienu līmeni vēlāk. Kas reiz var serverī izpildīt kodu, parasti grib tikt tālāk: startēt sistēmas komandas, lejupielādēt rīkus, ierīkot pastāvīgu slēpto piekļuvi. Daudzi no šiem soļiem norit caur dažām PHP funkcijām. Ja tās ir bloķētas, ceļš kļūst grūtāks un pamanāmāks.

Tāpēc disable_functions nav ielāpu aizstājējs, bet elements gadījumam, ja neskatoties uz visu piesardzību kaut kas tiek cauri. Tas attiecas gan uz nākotnes ievainojamībām, gan uz PHP2Shell.

## Ko PHP disable_functions dara un ko ne

Iestatījums izņem nosauktās funkcijas no izpildes vides. Ja skripts izsauc bloķētu funkciju, PHP pārtrauc darbu ar kļūdu. Bloķēšana attiecas uz katru kodu, kas darbojas šajā PHP procesā, tātad arī uz ievadīto kodu.

Robežas jums jāzina:

- Iestatījums nav noslēgta aizsargtelpa. PHP paplašinājumi, kļūdas interpretatorā vai programmas ārpus PHP to var apiet.
- Tas neliedz uzbrucējam lasīt vai rakstīt failus, kam PHP lietotājam ir piekļuve. Par to atbild failu tiesības un izolācija.
- Tas darbojas tikai no php.ini vai kā `php_admin_value`. Ar `ini_set()`, `.user.ini` vai `.htaccess` to iestatīt nevar.

Visvairāk disable_functions dod kopā ar tīru php.ini, atsevišķiem lietotājiem katrai vietnei un ierobežojošām failu tiesībām. Pamatus atradīsiet ceļvedī [php.ini drošā konfigurēšana](https://phpsos.de/lv/ratgeber/php-ini-sicher-konfigurieren/).

## Kuras funkcijas vajadzētu bloķēt

Tipiskām vietnēm bez vajadzības pēc sistēmas komandām ir noderējis šāds saraksts. Tas ietver funkcijas procesu startēšanai un darbojošos procesu vadīšanai.

| Grupa | Funkcijas | Tipisks likumīgs pielietojums |
|---|---|---|
| Komandu izpilde | `exec`, `shell_exec`, `system`, `passthru` | attēlu apstrāde, dublēšana ar skriptu |
| Procesu atvēršana | `proc_open`, `popen` | Composer, PDF rīki, pasta sūtīšana |
| Procesu vadība | `proc_nice`, `proc_terminate`, `proc_get_status` | rindas, fona uzdevumi |
| Procesu pārvaldība | `pcntl_exec`, `pcntl_fork` | parasti tikai komandrindā |
| Signāli un tiesības | `posix_kill`, `posix_setuid` | reti tīmekļa darbībā |

Kā konfigurācija tas izskatās šādi:

```ini
; tīmekļa darbības režīma php.ini, piem., /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
```

Ja saraksts neattiecas uz visām serverī esošajām vietnēm, iestatiet to katram FPM pūlam. Pēc pārlādes pārbaudiet, kurš saraksts šajā pūlā patiešām ir spēkā:

```ini
; /etc/php/8.3/fpm/pool.d/meine-seite.conf (fragments)
php_admin_value[disable_functions] = exec,shell_exec,system,passthru,proc_open,popen
```

## Lietojumprogrammu iepriekš pārbaudīt: tā izvairāties no atteikumiem

Kas sarakstu iestata nepārbaudītu, riskē, ka attēlu samazināšana, PDF rēķini vai pasta sūtīšana pēkšņi pārstās darboties. Tāpēc iepriekš kodā meklējiet skartās funkcijas:

```bash
# Kur un cik bieži funkcijas tiek izmantotas kodā?
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
```

Atradumi automātiski nenozīmē, ka funkcija darbībā ir vajadzīga. Daudzas bibliotēkas vispirms pārbauda, vai funkcija ir pieejama, un citādi izmanto citu ceļu. Izšķirošs ir tests starpposma (staging) vidē ar visām svarīgajām norisēm: pasūtījums, rēķins, veidlapas sūtīšana, attēla augšupielāde, ieplānotie uzdevumi.

Ja lietojumprogramma obligāti prasa kādu no šīm funkcijām, pārbaudiet ražotāja sistēmas prasības tā oficiālajā vietnē. Bieži uzdevumu var pārvietot uz atsevišķu pūlu vai komandrindas skriptu, kas nav pieejams caur tīmekli.

## Iestatījuma aktivizēšana un iedarbības kontrole

Pēc izmaiņas PHP konfigurācija jānolasa no jauna. Pēc tam pārbaudiet vērtību jūsu vietnes darbības režīmā, nevis komandrindā:

```bash
sudo systemctl reload php8.3-fpm
php-fpm8.3 -i | grep "^disable_functions"
# Pārbaudīt kļūdu žurnālu, vai nav bloķēto funkciju izsaukumu
sudo grep -i "has been disabled" /var/log/php/*.log | tail -20
```

Ziņojumi kļūdu žurnālā ir vērtīgi arī vēlāk. Ja tur pēkšņi parādās bloķētu funkciju izsaukumi, kaut gan jūsu lietojumprogramma tās neizmanto, tas var norādīt uz ievadītu kodu. Kā rīkoties tālāk, apraksta ceļvedis [Webshell atklāšana un noņemšana](https://phpsos.de/lv/ratgeber/webshell-erkennen/).

## Tipiskas kļūdas, lietojot disable_functions

Praksē nostiprināšana reti cieš tehnisku iemeslu dēļ, bet gan sīkumu dēļ. Šīs kļūdas ir sevišķi izplatītas:

- **Mainīts nepareizais fails:** saraksts ir tikai komandrindas php.ini, vietne darbojas caur PHP-FPM un paliek neaizsargāta.
- **Nav pārstartēšanas:** fails ir pareizs, bet darbojošies procesi vēl strādā ar veco konfigurāciju.
- **Bloķēts pārāk plaši:** līdzi tiek bloķētas funkcijas, piemēram, `ini_set` vai `mail`, un svarīgas norises nemanot pārtrūkst. Kļūdas tad bieži pamana tikai pēc dienām, piemēram, kad nenāk pasūtījumu apstiprinājumi.
- **Vienreiz iestatīts, nekad nepārbaudīts:** pēc pārcelšanās, PHP versijas maiņas vai atkārtotas uzstādīšanas ar hostinga paneli saraksts ir pazudis.
- **Maldinoša drošības sajūta:** bloķēšanu uzskata par atjauninājumu aizstājēju. Taču tā neaizver ievainojamību interpretatorā.

Tāpēc aktīvās vērtības pārbaudi iekļaujiet savā rutīnā pēc katra PHP atjauninājuma. Īss skatiens pietiek, prasa maz laika un neļauj nostiprināšanai nemanot pazust.

> **Padoms:**
> Ja serverī ir vairākas vietnes: katrai vietnei izveidojiet savu pūlu ar savu sarakstu. Papildus [open_basedir](https://phpsos.de/lv/ratgeber/open-basedir/) ierobežo direktorijus, kuriem PHP drīkst piekļūt.

## Kā PHP SOS palīdz konkrēti?

- Pārbaudām jūsu lietojumprogrammas kodu un norises attiecībā uz kritisko funkciju izmantošanu.
- Katrai vietnei nosakām piemērotu bloķēšanas sarakstu un pārbaudām to pirms palaišanas.
- Bloķēšanu apvienojam ar pūliem, failu tiesībām un protokolēšanu saskaņotā nostiprināšanas koncepcijā.
- Dokumentējam iestatījumus un uzraugām kļūdu žurnālu, vai nav aizdomīgu izsaukumu.

Kā tas norit kā kopējs risinājums, apraksta pakalpojums [Servera nostiprināšana PHP tīmekļa serveriem](https://phpsos.de/lv/leistungen/server-haertung/).


## Biežāk uzdotie jautājumi

**Vai disable_functions drīkst iestatīt ar ini_set() vai .htaccess?**  
Nē. Iestatījums darbojas tikai no php.ini vai kā php_admin_value FPM pūlā, attiecīgi Apache konfigurācijā. Izpildes laikā to iestatīt nevar, un lietojumprogramma bloķētās funkcijas arī nevar atkal atļaut.

**Vai disable_functions pasargā no PHP2Shell?**  
Nē. PHP2Shell skar pašu PHP interpretatoru, un ievainojamību aizver tikai atjauninājums. Bloķētas funkcijas tomēr var ierobežot uzbrucēja rīcības brīvību pēc sekmīgas izmantošanas.

**Kāpēc php -i rāda citu sarakstu nekā mana vietne?**  
Komandrinda bieži nolasa savu php.ini. Vietnei svarīga ir PHP-FPM, mod_php vai LiteSpeed konfigurācija. Tāpēc vērtību pārbaudiet tajā darbības režīmā, caur kuru darbojas jūsu vietne.

**Kurām lietojumprogrammām vajag proc_open vai exec?**  
Tas atkarīgs no lietojumprogrammas. Tipiski ir attēlu apstrāde ar ārējām programmām, PDF veidošana, pasta sūtīšana ar sendmail vai rīki, piemēram, Composer. Pārbaudiet to kodā un ražotāja sistēmas prasībās.

## Avoti

- [php.net: drošības ziņojumi](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)
