Aktuālā situācija: PHP2Shell. Divas kritiskas PHP ievainojamības (CVSS 9.2) ļauj izpildīt ļaunprātīgu kodu bez pieteikšanās. Ielāpi kopš 21.10.2026.Kas jādara tagad →

CGI un FastCGI: pamati

CGI katram pieprasījumam startē procesu, FastCGI uztur procesus dzīvus. Ko tas nozīmē PHP, php-cgi un PHP-FPM un kuri iestatījumi skar drošību.

Aktuāls uz 4 min lasīšanas laiksPHP zināšanas

Īsi: CGI (Common Gateway Interface) ir sena saskarne, kurā tīmekļa serveris katram pieprasījumam startē jaunu programmu, PHP gadījumā programmu php-cgi. FastCGI ir tālākā attīstība: PHP procesi darbojas pastāvīgi un pieņem daudzus pieprasījumus caur socket. PHP-FPM ir svarīgākā FastCGI realizācija PHP. Drošībai svarīgi galvenokārt ir cgi.* iestatījumi un noteikums, ka FastCGI piekļuve nekad nedrīkst būt publiski sasniedzama.

Kas ir CGI?

CGI ir viena no vecākajām metodēm, ar kuru tīmekļa serveri ģenerē dinamisku saturu. PHP rokasgrāmata pie iestatījuma cgi.rfc2616_headers atsaucas uz RFC 3875, Common Gateway Interface specifikāciju. Arī PHP pirmsākumi bija CGI programmas: Rasmus Lerdorf 1994. gadā uzrakstīja pirmos „Personal Home Page Tools“ kā CGI bināros failus C valodā.

Princips: katram pieprasījumam tīmekļa serveris startē jaunu procesu, nodod pieprasījuma datus caur vides mainīgajiem un standarta ievadi un nolasa atbildi no standarta izvades. Pēc tam process beidzas. Saskaņā ar PHP rokasgrāmatu PHP CGI un CLI gadījumā savu php.ini nolasa no jauna katrā izsaukumā, servera moduļu gadījumā tikai startējot.

Tas padara CGI noturīgu, jo katrs pieprasījums sākas ar svaigu procesu. Taču tas padara CGI arī lēnu: procesa startēšana, konfigurācijas ielāde un paplašinājumu inicializēšana katrā pieprasījumā prasa laiku.

Kas ir FastCGI?

FastCGI veiktspējas problēmu risina, uzturot procesus dzīvus. Tīmekļa serveris caur Unix socket vai TCP portu savienojas ar darbojošos procesu un nosūta tam pieprasījumu FastCGI protokolā. Process to apstrādā un gaida nākamo.

Pazīme CGI FastCGI ar php-cgi FastCGI ar PHP-FPM
Process katram pieprasījumam jā nē nē
SAPI nosaukums cgi-fcgi cgi-fcgi fpm-fcgi
Pūli ar savu lietotāju nē nē jā
Procesu vadība tīmekļa serveris tīmekļa servera modulis, piem., mod_fcgid savs master process
.user.ini tiek nolasīts jā jā jā

PHP-FPM saskaņā ar rokasgrāmatu ir PHP primārā FastCGI implementācija. Tas protokolu papildina ar procesu pārvaldību, pūliem, statusa lapām un slowlog. Detaļas skatiet sadaļā PHP-FPM izskaidrots.

cgi iestatījumi php.ini

CGI darbībai PHP ir savi iestatījumi. Turpmākās vērtības un apraksti ņemti no PHP rokasgrāmatas:

  1. cgi.force_redirect (noklusējums 1, INI_SYSTEM): saskaņā ar rokasgrāmatu nepieciešams, lai PHP kā CGI pie lielākās daļas tīmekļa serveru darbotos droši. Izslēgt tikai „uz paša risku“; IIS tam jābūt izslēgtam.
  2. cgi.fix_pathinfo (noklusējums 1, INI_SYSTEM): nodrošina pareizas PATH_INFO un PATH_TRANSLATED vērtības. Skriptiem jāizmanto SCRIPT_FILENAME, nevis PATH_TRANSLATED.
  3. cgi.discard_path (noklusējums 0, INI_SYSTEM): ļauj CGI bināro failu droši novietot ārpus tīmekļa direktorija, neapejot .htaccess aizsardzību.
  4. fastcgi.impersonate (noklusējums 0, INI_SYSTEM): svarīgs tikai IIS sistēmā Windows.
  5. user_ini.filename un user_ini.cache_ttl (noklusējums .user.ini un 300 sekundes): nosaka, vai un cik bieži PHP nolasa .user.ini failus.

Nginx gadījumā tam pieder arī tīra skripta ceļa nodošana. Lasāms pamatparaugs, bez garantijas katrai videi:

location ~ \.php$ {
    try_files $uri =404;               # PHP nodot tikai esošus failus
    fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

Rinda try_files $uri =404; neļauj pieprasījumus uz neesošiem .php ceļiem nodot tālāk PHP.

Kāpēc atklāta FastCGI piekļuve ir bīstama

PHP rokasgrāmata skaidri brīdina: kas var atvērt FastCGI savienojumu ar PHP, kontrolē pieprasījuma konfigurāciju, piemēram, auto_prepend_file, un tādējādi var izpildīt jebkuru kodu. Iemesls ir tas, ka tīmekļa serveri PHP iestatījumus drīkst līdzi nosūtīt ar FastCGI parametriem, piemēram, PHP_VALUE un PHP_ADMIN_VALUE.

No tā izriet skaidri noteikumi:

  • PHP-FPM vai php-cgi FastCGI režīmā pieslēgt tikai caur Unix socket, ja tīmekļa serveris darbojas tajā pašā resursdatorā.
  • TCP gadījumā iestatīt listen.allowed_clients un portu bloķēt ugunsmūrī; norādes skatiet rakstā Ugunsmūris tīmekļa serverim.
  • Socket tiesības ar listen.owner, listen.group un listen.mode turēt šauras.
Svarīgi

Ar ss -lntp | grep -i php pārbaudiet, vai kāds PHP process klausās TCP adresē. Piesaiste pie 0.0.0.0 vai publiskas adreses ir steidzams rīcības gadījums.

CGI, FastCGI un PHP2Shell

PHP2Shell skar gan php-cgi, gan PHP-FPM. Abiem ir spēkā: atjauninājums uz 8.5.12, 8.4.27, 8.3.36 vai 8.2.35 vai apstiprināts backport, pēc tam visi darbojošies PHP procesi jāpabeidz un jāpārstartē. FastCGI risinājumos ar php-cgi procesi bieži turpina darboties nemanāmi, jo tos nepārvalda neviens atsevišķs pakalpojums. Kā šo mantojumu atrast un aizstāt, skatiet sadaļā php-cgi: mantojums ar risku. Plesk šie varianti saucas citādi; palīdzību sniedz Plesk: PHP apstrādātāju izpratne.

Kā PHP SOS palīdz konkrēti?

  • Apzināt apstrādātājus: Mēs noskaidrojam, vai jūsu vietnes darbojas caur CGI, FastCGI ar php-cgi vai PHP-FPM.
  • Aizvērt piekļuves: Mēs pārbaudām sockets, portus un ugunsmūra noteikumus, lai neviena FastCGI piekļuve nebūtu sasniedzama no ārpuses.
  • Ielāpot un sakopt: Mēs atjauninām PHP un pabeidzam visus vecos procesus, arī pamestās php-cgi instances.
  • Aizstāt: Servera nostiprināšanas ietvaros mēs CGI mantojumu aizstājam ar PHP-FPM ar atsevišķiem pūliem.

Biežāk uzdotie jautājumi

Vai FastCGI ir tas pats, kas PHP-FPM?

Nē. FastCGI ir protokols, caur kuru tīmekļa serveris sazinās ar lietojumprogrammas procesu. PHP-FPM ir programma, kas šo protokolu realizē PHP un pārvalda procesus. Arī php-cgi var runāt FastCGI, taču tam nav pūlu.

Kāpēc tīrs CGI tiek uzskatīts par novecojušu?

CGI gadījumā tīmekļa serveris katram pieprasījumam startē jaunu procesu, un PHP katru reizi nolasa savu konfigurāciju. Tas prasa laiku un resursus. FastCGI un PHP-FPM uztur procesus pastāvīgi gatavībā un tāpēc ir ievērojami efektīvāki.

Kas ir .user.ini?

Fails .user.ini ir neliels konfigurācijas fails tīmekļa direktorijā. Saskaņā ar PHP rokasgrāmatu to nolasa tikai CGI un FastCGI SAPI, tātad arī PHP-FPM. Tajā drīkst būt tikai iestatījumi ar režīmiem INI_PERDIR, INI_USER vai INI_ALL.

Kā noteikt, vai manā serverī darbojas php-cgi?

Ar tikai lasošām komandām, piemēram, ps vai pgrep, meklējiet procesus ar nosaukumu php-cgi, un tīmekļa servera konfigurācijā skatieties ierakstus, piemēram, mod_fcgid, Action vai ScriptAlias ar php-cgi. Hostinga paneļos darbības režīmu bieži sauc par CGI vai FastCGI lietojumprogrammu.

Avoti

Tūlītējs kontakts

Katra stunda ir svarīga. Rakstiet mums tūlīt.

Īsi aprakstiet sistēmu, PHP versiju un novēroto. Mēs sazināsimies, noskaidrosim situāciju un strādāsim attālināti, līdz incidents ir slēgts un dokumentēts.

Tūlītēja palīdzība