Īsi: administratoriem bez izstrādātāja pieredzes, lai PHP darbinātu droši, pietiek ar piecām pamatlietām: PHP sastāv no vairākām programmām (komandrinda, PHP-FPM, Apache modulis), katrai ar savu versiju; iestatījumi iedarbojas līmeņos no php.ini līdz lietojumprogrammai; PHP-FPM sadala pieprasījumus darbprocesos pūlos; atjauninājums iedarbojas tikai pēc visu procesu pārstartēšanas; un žurnāli ir svarīgākā norāde, kad kaut kas nav kārtībā. Kas šos punktus pārzina, tas ievainojamības, piemēram, PHP2Shell, var aizvērt ātri un pierādāmi.
No kā PHP sastāv serverī
PHP nav viena programma. Tipiskā Linux serverī ir vairāki varianti, katrs pieslēgts ar servera saskarni (SAPI):
| Variants | Tipisks nosaukums | Kam |
|---|---|---|
| Komandrinda (CLI) | php, php8.3 |
cron uzdevumi, Composer, uzturēšanas skripti |
| PHP-FPM | php-fpm, php-fpm8.3 |
tīmekļa pieprasījumi aiz Nginx vai Apache |
| Apache modulis | mod_php, libphp |
tīmekļa pieprasījumi tieši Apache procesā |
| CGI | php-cgi |
vecākas uzbūves |
Katram variantam var būt cita versija un cits php.ini. Daudzos serveros paralēli darbojas arī vairākas PHP versijas, piemēram, 8.2 un 8.4. Atjauninājumā katra jāaplūko atsevišķi. Kā saskarnes darbojas, izskaidro PHP-FPM izskaidrots.
Kuru variantu jūsu vietnes patiešām apkalpo, noskaidrojat pēc darbojošamies procesiem un tīmekļa servera konfigurācijas:
ps -eo pid,user,lstart,cmd | grep -E "php|httpd|apache2" | grep -v grep
apachectl -M 2>/dev/null | grep -i php # vai Apache ielādē PHP moduli?
ls /run/php/ 2>/dev/null # FPM sockets, bieži katrai versijai un pūlam
Sleja ar startēšanas laiku vēlāk pārstartēšanā ir svarīga: visiem PHP procesiem jābūt startētiem pēc atjauninājuma brīža. Ja procesi darbojas ar dažādiem lietotājiem, tas norāda uz atsevišķiem pūliem, kas ir labi. Ja Apache parādās PHP modulis, kaut gan visām vietnēm jādarbojas caur FPM, tā ir norāde uz mantotu slogu, kas jānoņem. Hostinga saskarnēm, piemēram, Plesk vai cPanel, spēkā tas pats princips, tikai saskarne rāda versijas un apstrādātājus (handler) katrai vietnei; noteicošais tomēr ir tas, kas patiešām darbojas kā process.
Svarīgākās komandas administratoriem
php -v # komandrindas versija
php --ini # ielādētais php.ini un papildus nolasītie direktoriji
php --ini=diff # no PHP 8.5: novirzes no noklusējuma
php -m # iekompilētie un ielādētie moduļi
php --ri session # paplašinājuma iestatījumi
php -l datei.php # sintakses pārbaude bez izpildes
php-fpm8.3 -v # FPM binārfaila versija (nosaukums atkarībā no distributīva)
php-fpm8.3 -t # FPM konfigurācijas pārbaude bez pārstartēšanas
systemctl status php8.3-fpm
Divas norādes no rokasgrāmatas: php -l atrod sintakses kļūdas, bet ne kļūdas, kas rodas tikai izpildes laikā. Un php -i izsauc phpinfo(); izvade nepieder publiskiem failiem tīmekļa direktorijā.
Kā darbojas PHP iestatījumi
Iestatījumu var iestatīt vairākās vietās. Kas kur ko drīkst mainīt, nosaka katras direktīvas maiņas režīms:
- php.ini un conf.d: pamata konfigurācija katram variantam, nolasīta startā.
- FPM pūls:
php_valueunphp_admin_valuekatram pūlam. Arphp_admin_valueiestatītas vērtības lietojumprogramma saskaņā ar rokasgrāmatu arini_set()pārrakstīt nevar. - Direktorija līmenis:
.user.iniFPM gadījumā vai.htaccessmod_php gadījumā, tikai direktīvām režīmāINI_PERDIRvaiINI_ALL. - Lietojumprogramma:
ini_set()izpildes laikā, tikai direktīvām režīmāINI_ALL.
Piemērs: memory_limit ir režīmā INI_ALL, tātad lietojumprogramma to var mainīt. post_max_size ir INI_PERDIR, un to ar ini_set() mainīt nevar. Tāpēc php.net PHP2Shell pagaidu pasākumos prasa vērtības iestatīt tā, lai lietojumprogrammas tās nevarētu pārrakstīt. Detaļas par līmeņiem izskaidro php.ini izskaidrots.
PHP-FPM pūli īsumā
Pūls ir darbprocesu grupa ar savu lietotāju, savu sockets un saviem iestatījumiem. Svarīgākās direktīvas saskaņā ar rokasgrāmatu:
[shop]
user = shop
group = shop
listen = /run/php/shop.sock
pm = dynamic ; static, dynamic vai ondemand
pm.max_children = 20 ; ne vairāk kā 20 vienlaicīgu pieprasījumu
pm.max_requests = 500 ; darbprocesu atjaunot pēc 500 pieprasījumiem
request_slowlog_timeout = 5s
slowlog = /var/log/php-fpm/shop-slow.log
php_admin_value[error_log] = /var/log/php-fpm/shop-error.log
php_admin_flag[log_errors] = on
Atsevišķs pūls katrai vietnei ar savu lietotāju nošķir vietnes citu no citas. security.limit_extensions pēc noklusējuma ir .php .phar un neļauj FPM izpildīt citus faila paplašinājumus kā PHP. clear_env pēc noklusējuma ir ieslēgts un notur vides mainīgos prom no darbprocesa.
Žurnāli: kur administratoriem skatīties
PHP kļūdas raksta mērķī, kas noteikts ar error_log, PHP-FPM papildus savā žurnālā un lēniem pieprasījumiem slowlog ar backtrace. Tam pievienojas tīmekļa servera piekļuves un kļūdu žurnāli. Sekojiet, lai produkcijā display_errors būtu izslēgts un log_errors ieslēgts: kļūdām jābūt žurnālā, nevis tīmekļa lapā. Žurnāliem jābūt arī rotētiem un glabātiem noteiktu laiku, lai tie nopietnā gadījumā vēl būtu. Pēc PHP2Shell speciālistu prese iesaka glabāt servera žurnālus no 20.10.2026. Spēcīga brīdinājuma pazīme ir PHP-FPM vai tīmekļa servera process, kas startē shell; kā to atpazīt, rakstīts sadaļā Brīdinājuma pazīme: tīmekļa serveris startē shell.
Administratoru pārbaudes saraksts pēc PHP2Shell
- Uzskaitīt visus PHP variantus un versijas serverī, arī neizmantotos.
- Pārbaudīt pakotņu stāvokli; distributīva backport gadījumā changelog pārmeklēt uz CVE-2026-109618 un CVE-2026-109619.
- Atjaunināt uz 8.5.12, 8.4.27, 8.3.36 vai 8.2.35 vai apstiprināto backport.
- Pārstartēt PHP-FPM, Apache un LiteSpeed un pārbaudīt procesu startēšanas laikus.
- Pretpārbaude ar
php -r 'var_dump(ini_get("memory_hard_limit_percent"));';bool(false)saskaņā ar rokasgrāmatu nozīmē skartu versiju. - Saglabāt žurnālus un pārbaudīt uz neparastām pazīmēm.
Kā versiju un ielāpu stāvokli pierādīt uzticami, apraksta PHP versijas un ielāpu stāvokļa pareiza pārbaude.
Kā PHP SOS palīdz konkrēti?
Drošības uzturēšanas līgumā mēs kopā ar jūsu komandu uzņemamies PHP pamatkopšanu:
- Inventārs: visi PHP varianti, versijas, pūli un konfigurācijas vietas katrā serverī.
- Konfigurācija: drošībai nozīmīgas vērtības iestatītas ar
php_admin_value, pūli katrai vietnei nošķirti. - Atjauninājumi: ieviešana, pārstartēšana, kontrole un dokumentēšana pie katra drošības izlaiduma.
- Zināšanu nodošana: mēs jūsu administratoriem izskaidrojam, ko esam mainījuši un kāpēc.
Biežāk uzdotie jautājumi
Kāpēc php -v rāda citu versiju nekā vietne?
Komandrinda, PHP-FPM un Apache modulis ir atsevišķas programmas ar savu versiju un savu php.ini. php -v rāda tikai komandrindu. Vietnei svarīga ir tā binārfaila versija, kas patiešām apstrādā pieprasījumus.
Kāds php.ini darbojas manā serverī?
To komandrindai rāda php --ini. PHP-FPM parasti ir savs php.ini un papildu pūla faili. Kopš PHP 8.5 php --ini=diff rāda, kuras vērtības atšķiras no noklusējuma.
Kāda ir atšķirība starp php_value un php_admin_value?
Abi iestata iestatījumus FPM pūlā. Vērtības ar php_admin_value lietojumprogramma saskaņā ar rokasgrāmatu ar ini_set() pārrakstīt nevar. Drošībai nozīmīgiem iestatījumiem tāpēc pareizā izvēle ir php_admin_value.
Vai pietiek ar atjauninājumu bez pārstartēšanas?
Nē. Darbojošies PHP procesi atmiņā patur veco kodu. Pēc atjauninājuma jāpārstartē PHP-FPM, Apache ar mod_php vai LiteSpeed, citādi turpina darboties ievainojamā versija.